2014-04-15 172 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拥有最大数量的元素,因此只要线条本身不太长,就可以防止出现问题。

相关问题