将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.float
和1.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的主要内容,如果未能解决你的问题,请参考以下文章