2015-06-02 20 views
1

我有浮點數的以下字符串:轉換固定寬度,不可分隔的浮動字符串逗號分隔值

0.621464022829E+00-.143866495639E-020.266573765475E-02-.582189744480E-07 

正如你所看到的,有這串數字之間沒有空格。我試圖讓他們csv。因此,我想他們看起來像:

0.621464022829E+00,-.143866495639E-02,0.266573765475E-02,-.582189744480E-07 

有沒有辦法在python中做到這一點?我試圖用numpy讀取文件,例如:

>>> w=numpy.loadtxt('coord', dtype='float') 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 856, in loadtxt 
items = [conv(val) for (conv, val) in zip(converters, vals)] 
ValueError: invalid literal for float(): 
0.621464022829E+00-.143866495639E-020.266573765475E-02-.582189744480E-07 

但是由於沒有空格,所以不可能。我也試過numpy.fromfile這似乎讀取該文件,但它顯示了這一點:

>>> w=numpy.fromfile('coord', dtype='float') 
>>> w 
array([ 3.53728147e-057, 3.03226305e-100, 5.64351177e-038, 
     3.70004839e-033, 1.24395502e-047, 3.37923148e-057, 
     2.93531907e-086, 3.69971918e-057, 7.25394458e-043]) 

我會很高興,如果有人能在這個問題提供一些線索。

編輯:所選答案的作品,但我想補充一點,由@DSM提出的解決方案是艾利一樣好:

np.genfromtxt("file.dat", delimiter=18) 
+0

究竟是誰產生輸出這樣嗎? –

+0

@LutzHorn我也這麼認爲...但至少不是我! – muammar

回答

4

看起來你堅持固定寬度值而不是分隔。您必須根據字符寬度切分字符串。

>>> s = '0.621464022829E+00-.143866495639E-020.266573765475E-02-.582189744480E-07' 
>>> [float(s[i:i+18]) for i in range(0, len(s), 18)] 
[0.621464022829, -0.00143866495639, 0.00266573765475, -5.8218974448e-08] 

從CSV你可以做類似

with open('file.csv') as f: 
    data = [[float(line[i:i+18]) for i in range(0, len(line), 18)] for line in f.readlines()] 

然後,您可以把它傳遞給numpy閱讀,如果你想

w = numpy.array(data) 
+0

請注意,'np.genfromtxt'也接受'delimiter'參數的寬度,所以'np.genfromtxt(「file.dat」,delimiter = 18)'也應該工作。 – DSM

+0

@DSM我不知道,我更喜歡這個解決方案!如果您發佈它作爲一個答案,你會從我這得到+1 :) – CoryKramer

+0

看: 0.107388301057E + 000.232744370788E-02-.629485908820E-030.972872524621E-03 不可能有固定用的方法!還是我計算錯誤? – muammar