将ascii文件读入numpy数组

时间:2014-09-13 17:58:26

标签: python arrays numpy

我有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而没有问题以及有关行数和列数的假设?

2 个答案:

答案 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.openutf-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()