[英]numpy.genfromtxt skips/ignores last line in long tsv file
我有一个来自QuickDAQ的tsv文件,其中有三列20万个值,我想导入到numpy中。 问题是genfromtxt似乎错过了最后一行。 就我所知,这行代码与众不同:
...
0,00232172012329102 0,0198968648910522 0,0049593448638916
0,00411009788513184 0,0142784118652344 0,00339150428771973
0,00499653816223145 0,00666630268096924 0,00308072566986084
无法正常工作的代码示例:
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样式的换行符,我尝试在vi中删除这些换行符,但没有任何区别。 是什么原因可能导致genfromtxt出现这种行为,以及如何解决(最好是无需手动编辑tsv文件)?
好吧,该文件似乎只有几行带有制表符。 我很惊讶np.genfromtxt
没有引发ValueError
。 防止该问题的一种方法是删除那些空的制表符行。 另一个可能是在对np.genfromtxt
的调用中使用invalid_raise=False
参数:
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
在列表中的项目,而不必调用repr
直接。 repr
使您可以轻松查看制表符和行尾字符在哪里。
通过检查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
具有最大数量的元素,因此只要线本身不太长,就可以避免此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.