2011-05-13 84 views
6

我想读喜欢1.2345D + 02成蟒蛇一个Fortran双精度数,但我得到了以下错误:阅读FORTRAN双精度格式转换成蟒蛇

>>> 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”读那些双精度数字?

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

+0

只是一个头脑,也许'fortranformat' Python库(在PyPI上)可以提供帮助 - 我应该透露我是作者。 – Brendan 2011-06-29 18:32:17

回答

4

float(str.replace("D", "E"))怎么了?

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

您似乎有一些更深层次的目的,也许对此有所帮助。

+0

一般来说,将“D”替换为“E”没有任何问题。我只想知道是否有“本地”解决方案。如果numpy支持fortran符号,为什么它会失败,如示例中所示? 是的,我需要解析一些Fortran生成的巨大数据文件并提取一些特定的数据。谢谢! – iluvatar 2011-05-13 08:50:02

+1

因为'numpy.float(1.2345D + 02)'会被python解释器解析为'numpy.float'与'1.2345D + 02'的调用。 python解释器不知道“1.2345D + 02”,所以它给出错误。 ''1.2345D + 02“'是一个字符串,非常好。 – orlp 2011-05-13 08:58:09

+0

谢谢。其实这是我的例子中的一个错字。我已经纠正它,但错误(另一个)仍然存在。 – iluvatar 2011-05-13 09:01:55

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