我有ascii
个文件,我想把它读成numpy array
。但它失败了,对于文件中的第一个数字,当我使用numpy.genfromtxt
时它返回'NaN'。然后我尝试使用以下方式将文件读入数组:
lines = file('myfile.asc').readlines()
X = []
for line in lines:
s = str.split(line)
X.append([float(s[i]) for i in range(len(s))])
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
ValueError: could not convert string to float: 15.514
当我打印文件的第一行时,它看起来像:
>>> s
['\xef\xbb\xbf15.514', '15.433', '15.224', '14.998', '14.792', '15.564', '15.386', '15.293', '15.305', '15.132', '15.073', '15.005', '14.929', '14.823', '14.766', '14.768', '14.789']
我怎样才能将这样的文件读成numpy array
而没有问题以及有关行数和列数的假设?
答案 0 :(得分:5)
根据@fatetru的回答,我想提供一个Numpy文件阅读功能的解决方案:
import numpy as np
import codecs
with codecs.open('myfile.asc', encoding='utf-8-sig') as f:
X = np.loadtxt(f)
使用正确的编码将文件加载到打开的文件实例中。 Numpy使用这种句柄(它也可以使用来自open()
的句柄,并且像其他所有情况一样无效。
答案 1 :(得分:1)
该文件使用带有BOM的utf-8进行编码。使用codecs.open
和utf-8-sig
编码正确处理(排除BOM \xef\xbb\xbf
)。
import codecs
X = []
with codecs.open('myfile.asc', encoding='utf-8-sig') as f:
for line in f:
s = line.split()
X.append([float(s[i]) for i in range(len(s))])
更新您根本不需要使用索引:
with codecs.open('myfile.asc', encoding='utf-8-sig') as f:
X = [[float(x) for x in line.split()] for line in f]
BTW,如果您没有特殊原因,请使用str.split(line)
而不是使用未绑定的方法line.split()
。