5

我必须阅读一个数据文件,其中包含用(非常)旧的 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 格式,所以我想也许有人已经弄清楚了。有谁知道图书馆可以读取这样的数字?

4

4 回答 4

8

您可以按如下方式使用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

我应该声明一个偏见,因为我写了这个库......

于 2012-11-25T14:33:48.897 回答
5

您可以使用正则表达式在将数字传递给之前插入“E” float

re.sub(r'(\d)([-+])', r'\1E\2', number)
于 2012-11-07T16:40:28.087 回答
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]
于 2012-11-07T16:42:39.633 回答
0

另一种方法是使用系统命令访问 AWK:

注意里面的 " 字符的转义COMMAND

import subprocess
COMMAND = "awk 'gsub(/D/,\"E\");{print}' epsc8.out > epsc8E.out"
subprocess.call(COMMAND, shell=True)
于 2018-05-19T00:01:27.850 回答