2013-03-11 74 views
3

我有數百個字符串都有相同的格式 - 兩個整數,後面跟着三個浮點數。一個例子:解析一個帶有浮點數和整數的python字符串

1 10 1.2345 5.4321 10.5647 

我只是想把這些字符串一個接一個地解析成它們各自的整數和浮點數。我可以想到幾種方法來做到這一點,但我希望python會有一些優雅的東西,這與str.format被用來寫作的東西相反。這似乎是非常基本的功能,所以我很抱歉,如果我問的是已經回答的問題,但我無法在任何地方找到解決方案。有什麼想法嗎?謝謝。

+1

http://mattgemmell.com/2008/12/08 /你曾嘗試過/ – XORcist 2013-03-11 21:07:50

+1

我的組織的防火牆阻止了該站點。 – 2013-03-11 21:09:39

+0

嘿,他們不希望你太努力,我猜?它開始於:「如果你是一名開發人員,並且你打算向另一個開發人員提出一個技術問題(在論壇上,通過電子郵件,在聊天頻道或親自面試),你最好準備回答這個問題「你有什麼嘗試?」「 – askewchan 2013-03-11 21:41:30

回答

2

我想你最好過的東西,如numpy的的genfromtxtloadtxt

import numpy as np 
import StringIO 

s = """1 10 1.2345 5.4321 10.5647 
     2 14 434.35 345.34 1000000 
     3 8 253.235 2.53 .002345""" 
f = StringIO.StringIO(s) 

data = np.genfromtxt(f, names = 'id, count, x, y, z', dtype=[int,int,float,float,float]) 

這給你的這些東西一個數組,所以第一行可以訪問爲

data[0] 
#(1, 10, 1.2345, 5.4321, 10.5647) 

或所有第二欄:

data['count'] 
#array([10, 14, 8]) 

順便說一句,這將在浮動列整數轉換成浮動,如果你的花車之一恰好是一個整數。

4

一個簡單的列表理解應該做的伎倆

>>> mystr = '1 10 1.2345 5.4321 10.5647' 
>>> [int(s) if s.isdigit() else float(s) for s in mystr.split()] 
[1, 10, 1.2345, 5.4321, 10.5647] 
+2

這會將負整數轉換爲浮點數。可能這不會成爲問題,但是ast.literal_eval會避免它。 – DSM 2013-03-11 21:16:54

1

你可以做這樣的事情:

def linep(line): 
    line=line.split() 
    try: 
     ints=map(int, line[0:2]) 
     floats=map(float, line[2:5]) 
    except ValueError as e: 
     print e 
    return ints+floats 

print linep('1 10 1.2345 5.4321 10.5647') 

然後使用這種方式:

>>> s='''1 10 1.2345 5.4321 10.5647 
-2 11 -0.5 0.5 .3''' 
>>> for line in s.splitlines(): 
...  print linep(line) 

打印:

[1, 10, 1.2345, 5.4321, 10.5647] 
[-2, 11, -0.5, 0.5, 0.3] 
+0

謝謝。類似的東西是我的選擇之一。不過,我希望有一些簡短而又甜蜜的東西,就好像格式化的輸出相反。 – 2013-03-11 21:55:06