高效计算文本文件的列数

2 投票
2 回答
4465 浏览
提问于 2025-04-18 15:06

我有一些很大的用制表符分隔的文本文件,格式大概是这样的:

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 个回答

3

你不需要用numpy来做这个;只要读取一行,把它按制表符分开,然后找出列表的长度就可以了:

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)
2

如果你想确保使用的格式和NumPy完全一致,最简单的方法就是把第一行数据放在一个包装器里。

如果你查看一下loadtxt的文档,你会发现fname这个参数可以是:

文件、文件名或者生成器来读取。

实际上,它甚至不一定要是生成器;任何可迭代的东西都可以,比如一个列表。所以:

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

换句话说,我们只需要读取第一行,把它放进一个只有一个元素的列表里,然后把这个列表传给loadtxt,这样它就会把这行数据当作一个单行文件来解析。

撰写回答