将fortran双精度格式读入python

时间:2011-05-13 08:39:48

标签: python input double fortran

我正在尝试将一个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

通过关注Python scientific notation using D instead of E的建议,我尝试了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 个答案:

答案 0 :(得分:5)

float(str.replace("D", "E"))出了什么问题?

请注意,numpy支持fortran表示法:numpy.float("1.2345D+02")

你似乎有一些更深层的目的,或许可以解释它会有所帮助。

答案 1 :(得分: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']