将固定宽度,非分隔的浮点字符串转换为逗号分隔值

时间:2015-06-02 14:49:41

标签: python csv

我有以下字符串浮点数:

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) 

1 个答案:

答案 0 :(得分: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)