我必须读取一个包含用(非常)旧FORTRAN样式格式化的数字的数据文件。该文件的一行如下所示:
4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3
文件(或大部分文件)以固定宽度格式包含这些数字。在Python中读取这些数字的麻烦在于这些数字中没有E
。看看会发生什么:
>>> float('4.50000+1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 4.50000+1
我可以写一个解析器来阅读它,但想知道这是否已经完成。这是一种旧的FORTRAN格式,所以我想也许有人已经弄清楚了。有没有人知道要读这样的数字库吗?
答案 0 :(得分:5)
在将数字传递给float
之前,您可以使用正则表达式插入“E”。
re.sub(r'(\d)([-+])', r'\1E\2', number)
答案 1 :(得分:5)
您可以使用Fortran Format Library for Python,如下所示,
>>> import fortranformat as ff
>>> reader = ff.FortranRecordReader('(6F13.7)')
>>> reader.read(' 4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3')
[45.0, 0.001894719, 46.0, 0.008196721, 47.0, 0.002869539]
该库已经过英特尔的ifort 9.1编译器的广泛测试,以匹配一些奇怪的FORTRAN文本IO。
使用
安装pip install fortranformat
自从我写这个库以来,我应该宣布一个偏见...
答案 2 :(得分:2)
这应该有效:
In [47]: strs="4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3"
In [48]: [float(x.replace("+","e+").replace("-","e-")) for x in strs.split()]
Out[48]: [45.0, 0.001894719, 46.0, 0.008196721, 47.0, 0.002869539]
答案 3 :(得分:0)
另一种方法是使用系统命令访问AWK:
请注意“COMMAND
import subprocess
COMMAND = "awk 'gsub(/D/,\"E\");{print}' epsc8.out > epsc8E.out"
subprocess.call(COMMAND, shell=True)