高效计算文本文件的列数
我有一些很大的用制表符分隔的文本文件,格式大概是这样的:
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
,这样它就会把这行数据当作一个单行文件来解析。