使用Python读取FORTRAN格式的数字

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格式,因此我认为可能已经有人解决了这个问题。是否有人知道一个库可以读取这样的数字?


最简单的方法可能是在 +- 前插入一个 E,然后 Python 将得到结果字符串。(假设这确实是它的意思)。 - hmakholm left over Monica
1
从未见过这样的Fortran输出。 - agentp
4个回答

8
您可以按照以下方式使用Python的Fortran格式库: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]

这个库已经经过广泛测试,以确保能够完美匹配一些奇怪的FORTRAN文本IO,并兼容Intel ifort 9.1编译器。

安装方法:

pip install fortranformat

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


Bitbucket的链接已经失效了。这个现在是官方仓库吗? - s-m-e
1
是的,现在它在 https://github.com/brendanarnold/py-fortranformat 上。 - Brendan

5
您可以使用正则表达式在将数字传递给float之前插入“E”。
re.sub(r'(\d)([-+])', r'\1E\2', number)

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]

1
这就是我要做的事情,但我想知道是否已经有人做过类似的事情。显然,如果要成为一个完整的库,还需要更多的库特性,但这是最基本的。 - jlconlin
1
@Jeremy 请看一下这个:一个将FORTRAN格式的浮点字符串转换为浮点数的Python函数 - Ashwini Chaudhary
那个函数看起来很不错。只需要进行一些小的修改,因为我的所有数字都是这样格式化的,而不仅仅是小数。 - jlconlin
2
负数怎么办?-4.5000+1 - mgilson
1
最好检查一下是否有负数以及它们的格式——可能会出现没有空格直接跟在下一个数字后面的情况,假设有固定的字段宽度。 - agentp

0
另一种方法是使用系统命令访问 AWK:
请注意在 COMMAND 中转义 " 字符。
import subprocess
COMMAND = "awk 'gsub(/D/,\"E\");{print}' epsc8.out > epsc8E.out"
subprocess.call(COMMAND, shell=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接