来自 fortran 的数字太大:值错误:无法将字符串转换为浮点数:'0.22738+109'



我正试图使用np.loadtxt从fortran文件中提取实值,文件名为fort.31python似乎没有考虑一个数字:0.22738+109

你知道如何克服它吗?

这是我的代码

vraisemblance2d=np.loadtxt("fort.31")

这是我得到的完整错误

Traceback (most recent call last): 
 File "plots3d.py", line 28, in <module> 
   vraisemblance2d=np.loadtxt("fort.31") 
 File "/home/myname/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 1146, in loadtxt 
   for x in read_data(_loadtxt_chunksize): 
 File "/home/myname/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 1074, in read_data 
   items = [conv(val) for (conv, val) in zip(converters, vals)] 
 File "/home/myname/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 1074, in <listcomp> 
   items = [conv(val) for (conv, val) in zip(converters, vals)] 
 File "/home/myname/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 781, in floatconv 
   return float(x) 
ValueError: could not convert string to float: '0.22738+109'

好,四列。我对fortran一无所知,所以我只想在python方面处理它。我假设utf编码,但可能需要调整:

conv =  lambda x: float("e+".join(x.split("+")))   
vraisemblance2d = np.loadtxt("fort.31", 
converters = {i : conv for i in range(4)},
encoding   = "utf-8")

如果这不起作用,并且fortran为您提供了#.###+####.###e+###格式的混合,那么您将需要regex。

import re
reg = re.compile('(d.d+)+(d+)')
def conv(x):
try:
return float(x)
except:
return float("e+".join(reg.match(x).groups())) 
vraisemblance2d = np.loadtxt("fort.31", 
converters = {i : conv for i in range(4)},
encoding   = "utf-8") 

警告:我不是regex向导,可能有更好的&更快的方法。

最新更新