2014-09-13 44 views
3

我有一個ascii文件,我想將其讀入numpy array。但是它失敗了,對於文件中的第一個數字,當我使用numpy.genfromtxt時,它返回'NaN'。然後我試圖使用的文件讀入一個數組的方式如下:讀取ascii文件到一個numpy數組

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沒有問題,並有任何關於行和列的假設?

+1

http://stackoverflow.com/a/22196962/1461850 – atomh33ls 2014-09-15 10:45:34

回答

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))]) 

UPDATE你並不需要使用索引的所有:

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()如果你沒有特殊的理由這樣做。

+0

使用'str.split (line)'和'line.split()'? – Dalek 2014-09-13 18:08:05

+0

@Dalek,請參見[這個答案](http://stackoverflow.com/a/114267/2225682) – falsetru 2014-09-13 18:12:52

5

基於@ falsetru的答案,我想提供與NumPy的文件讀取功能的解決方案:

import numpy as np 
import codecs 

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

這將文件加載到使用正確的編碼,打開的文件實例。 Numpy使用這種類型的句柄(它也可以使用來自open()的句柄,並且在其他情況下看起來像是一樣的)