我正试图使用np.loadtxt
从fortran文件中提取实值,文件名为fort.31
python似乎没有考虑一个数字: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
向导,可能有更好的&更快的方法。