有效地计算文本文件的列数

时间:2014-07-28 20:53:58

标签: python numpy file-io

我有一堆大的制表符分隔的文本文件,格式类似于:

a   0.0694892   0   0.0118814   0   -0.0275522  
b   0.0227414   -0.0608639  0.0811518   -0.15216    0.111584    
c   0   0.0146492   -0.103492   0.0827939   0.00631915

计算我一直使用的列数:

>>> import numpy as np
>>> np.loadtxt('file.txt', dtype='str').shape[1]
6

但是,对于较大的文件,此方法显然效率不高,因为整个文件内容在获取shape之前已加载到数组中。有一种简单的方法,效率更高吗?

2 个答案:

答案 0 :(得分:3)

你不需要为此而烦恼;只需读取一行,将其拆分为选项卡并查找列表的长度:

with open('file.txt', 'rb') as f:
    line = next(f) # read 1 line
    n = len(line.split('\t'))

如果以后要加载整个数组,可以使用:

f.seek(0)
arr = np.loadtxt(f)

答案 1 :(得分:1)

如果您想确保使用与NumPy完全相同的格式,最简单的解决方案是在第一行附近提供一个包装。

如果您查看loadtxt的文档,fname参数可以是:

  

要读取的文件,文件名或生成器。

事实上,它甚至不一定是发电机;任何迭代都可以。比如说,列表。所以:

 with open('file.txt', 'rb') as f:
     lines = [f.readline()]
 np.loadtxt(lines, dtype='str').shape[1]

换句话说,我们只是阅读第一行,将其粘贴在一个元素列表中,然后将其传递给loadtxt,并将其解析为就像是一行文件一样。