在Python中读取Fortran双精度格式

7 投票
2 回答
4974 浏览
提问于 2025-04-16 17:33

我想把一个Fortran的双精度数字,比如1.2345D+02,读入Python,但遇到了以下错误:

>>> float('1.2345D+02')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 1.2345D+02

我按照这个链接里的建议,尝试使用numpy,但还是出现了同样的错误:

import numpy
>>> numpy.float("1.2345D+02")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 1.2345D+02

有没有办法在Python中读取这些双精度数字,而不只是把'D'换成'E'呢?

补充:我修正了字符串中的一个错误语法,但还是出现了错误。

2 个回答

1

我们可以通过使用正则表达式来让替换操作更加小心一些:

import re
re_dbl_fort = re.compile(r'(\d*\.\d+)[dD]([-+]?\d+)')

text = 'DEW=[0.242D+03 -4.320D-06]'
re_dbl_fort.sub(r'\1E\2', text)
# DEW=[0.242E+03 -4.320E-06]

或者,如果你有一串从文件中读取的字符串(每一行),可以使用 readlines() 来处理:

lines = ['REPORT CARD\n', 'GRADE: D+ (1.3D+00/4.0D+00)\n']
for ln, line in enumerate(lines):
    res = re_dbl_fort.sub(r'\1E\2', line)
    if line != res:
        lines[ln] = res
# ['REPORT CARD\n', 'GRADE: D+ (1.3E+00/4.0E+00)\n']
5

为什么 float(str.replace("D", "E")) 这样写不对呢?

需要注意的是,numpy确实支持fortran的表示法:numpy.float("1.2345D+02")

你似乎有一些更深层的目的,也许如果能解释一下,会更有帮助。

撰写回答