将fortran双精度格式读入python

Posted

技术标签:

【中文标题】将fortran双精度格式读入python【英文标题】:Reading fortran double precision format into python 【发布时间】:2011-05-13 08:39:47 【问题描述】:

我正在尝试将像 1.2345D+02 这样的 Fortran 双精度数读入 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”?

编辑:我替换了字符串上的错误语法。但我仍然得到错误。

【问题讨论】:

请注意,fortranformat Python 库(在 PyPI 上)可能会有所帮助 - 我可能应该透露我是作者。 【参考方案1】:

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

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

您似乎有一些更深层次的目的,也许阐明它会有所帮助。

【讨论】:

一般来说,将“D”替换为“E”并没有什么问题。我只想知道是否有“本机”解决方案。如果 numpy 支持 fortran 表示法,为什么它会失败,如示例所示?是的,我需要解析一些巨大的 fortran 生成的数据文件并提取一些特定的数据。谢谢! 因为numpy.float(1.2345D+02) 会被python 解释器解析为对numpy.float1.2345D+02 的调用。 1.2345D+02 对 python 解释器来说是未知的,所以它给出了一个错误。 "1.2345D+02" 是一个字符串,非常好。 谢谢。实际上这是我的例子中的一个错字。我已经纠正了它,但错误(另一个)仍然存在。 可能你正在使用不同版本的 numpy 至少numpy 1.5.1支持numpy.float("1.2345D+02")【参考方案2】:

使用正则表达式可以使替换更加小心:

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']

【讨论】:

以上是关于将fortran双精度格式读入python的主要内容,如果未能解决你的问题,请参考以下文章

Fortran 90 中是不是有更好的双精度赋值?

将文本文件中的某些双精度读入列表

代码指定的双精度和编译器选项双精度之间的差异

FORTRAN语言中,FORMAT(1X,E8.2)是啥意思

1.1输出浮点数

如何将 Fortran 输出读入 Python?