将ascii文件读入numpy数组

Dal*_*lek 3 python arrays numpy

我有一个ascii文件,我想把它读成一个numpy array.但它失败了,对于文件中的第一个数字,它在我使用时返回'NaN' numpy.genfromtxt.然后我尝试使用以下方式将文件读入数组:

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
Run Code Online (Sandbox Code Playgroud)

当我打印文件的第一行时,它看起来像:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

我怎么能把这样一个文件读成numpy array没有问题和关于行数和列数的假设?

seb*_*bix 5

基于@fattru的答案,我想提供一个Numpy文件读取功能的解决方案:

import numpy as np
import codecs

with codecs.open('myfile.asc', encoding='utf-8-sig') as f:
    X = np.loadtxt(f)
Run Code Online (Sandbox Code Playgroud)

它使用正确的编码将文件加载到打开的文件实例中.Numpy使用这种句柄(它也可以使用句柄,open()并且像其他情况一样工作.


fal*_*tru 4

该文件采用带 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))])
Run Code Online (Sandbox Code Playgroud)

更新您根本不需要使用索引:

with codecs.open('myfile.asc', encoding='utf-8-sig') as f:
    X = [[float(x) for x in line.split()] for line in f]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果没有特殊原因str.split(line),请不要使用未绑定方法。line.split()