繁体   English   中英

numpy.genfromtxt跳过/忽略长tsv文件中的最后一行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM