2014-04-15 469 views
1

我有一個來自QuickDAQ的tsv文件,有三列200 000個值,我想導入numpy。問題是genfromtxt似乎錯過了最後一行。該生產線是沒有什麼兩樣的,據我可以看到:numpy.genfromtxt跳過/忽略長tsv文件中的最後一行

In [245]: import numpy as np 

In [246]: oompa = np.genfromtxt('C_20k_73_2.tsv',delimiter='\t',usecols=(0,1,2),unpack=True,skip_header=13,dtype=str) 

In [248]: oompa[1] 
Out[248]: 
array(['-0,00884926319122314', '-0,00379836559295654', 
    '0,000106096267700195', ..., '0,0259654521942139', 
    '0,0198968648910522', '0,0142784118652344'], 
    dtype='<U21') 

文件已windows風格的換行符,我:那完全不是那麼回事的代碼

... 
0,00232172,0198968648910522  0,0049593448638916 
0,00411009788513184  0,0142784118652344  0,00339150428771973 
0,00499653816223145  0,00666630268096924  0,00308072566986084 

例已經嘗試刪除這些在vi中,但它沒有區別。什麼可能會導致genfromtxt這種行爲,以及如何處理,最好不用手動編輯tsv文件?

+1

打印文件最後幾行的'repr'。這可能會給我們一個線索。 – unutbu

+0

In [270]:repr(foo.readline()) Out [270]:''0,00232172\\ t0,0198968648910522 \\ t0,0049593448638916 \\ n'' In [271]:repr(foo .readline()) Out [271]:'''0,00411009788513184 \\ t0,0142784118652344 \\ t0,00339150428771973 \\''' In [272]:repr(foo.readline()) Out [272 ]:'''0,00499653816223145 \\ t0,00666630268096924 \\ t0,00308072566986084 \\''' 在[273]:repr(foo.readline()) Out [273]:「'\\ t \\ n'' [274]:repr(foo.readline()) 輸出[274]:「'\\ t \\ n'」 – sjp

+0

這是您所追求的嗎? – sjp

回答

1

那麼,該文件似乎有一些只有標籤的行。我很驚訝np.genfromtxt沒有提出ValueError。防止問題的一種方法是刪除那些空的標籤行。另一種可能是使用在呼叫的invalid_raise=False參數np.genfromtxt

oompa = np.genfromtxt('C_20k_73_2.tsv',delimiter='\t', 
      usecols=(0,1,2),unpack=True,skip_header=13, 
      dtype=str, invalid_raise=False) 

這將跳過與np.genfromtxt預計解析列數不一致線。


如果文件不是太長,一個簡單的方法來查看文件的最後幾行是

print(open(filename, 'rb').read().splitlines()[:-3]) 

由於該打印清單,你得到的物品在repr該列表無需直接撥打reprrepr可以很容易地看到標籤和行尾字符的位置。

通過檢查repr最後一行成功解析np.genfromtxt與跳過的第一行進行比較,您應該能夠發現造成問題的模式中斷。


如果該文件是很長的,你可以打印使用

import collections 
lines = collections.deque(maxlen=2) 
with open('data', 'rb') as f: 
    lines.extend(f) 
print(list(lines)) 

的最後幾行open(filename, 'rb').read().splitlines()的問題是,它會讀取整個文件到內存中,然後拆分巨大的字符串轉換成巨大的名單。當文件太大時,這可能會導致MemoryError。 deque擁有最大數量的元素,因此只要線條本身不太長,就可以防止出現問題。

相關問題