[英]python jump to a line in a txt file (a gzipped one)
我正在阅读一个大文件并进行处理。 我希望能够跳到文件的中间,而不需要花费很长时间。
现在我在做:
f = gzip.open(input_name)
for i in range(1000000):
f.read() # just skipping the first 1M rows
for line in f:
do_something(line)
是否有更快的方法来跳过压缩文件中的行? 如果我必须首先解压缩它,我会这样做,但必须有一种方法。
它当然是一个文本文件, \\n
分隔行。
gzipping的本质是当压缩文件时不再存在行的概念 - 它只是一个二进制blob。 看看这个解释gzip的作用。
要读取文件,您需要对其进行解压缩 - gzip
模块可以很好地完成它。 像其他答案一样,我也建议使用itertools
进行跳跃,因为它会仔细确保你不会把东西拉进记忆中,它会尽快让你到达那里。
with gzip.open(filename) as f:
# jumps to `initial_row`
for line in itertools.slice(f, initial_row, None):
# have a party
或者,如果这是您要使用的CSV,您也可以尝试计时pandas
解析,因为它可以处理解压缩gzip
。 这看起来像: parsed_csv = pd.read_csv(filename, compression='gzip')
。
另外,要清楚一点,当你在python中迭代文件对象时 - 就像上面的f
变量一样 - 你遍历行。 您不需要考虑'\\ n'字符。
你可以使用itertools.islice ,传递一个文件对象f
和起点,它仍然可以推进迭代器,但比下一次调用1000000次更有效:
from itertools import islice
for line in islice(f,1000000,None):
print(line)
不太熟悉gzip,但我想f.read()
会读取整个文件,因此接下来的999999调用什么都不做。 如果你想手动推进迭代器,你可以在文件对象上调用next,即next(f)
。
调用next(f)
并不意味着所有行都会立即读入内存,它会一次使迭代器前进一行,所以如果你想跳过文件或标题中的一行或两行,它就会很有用。
作为@wwii建议食谱的消费食谱也值得一试
并不是的。
如果您知道要跳过的字节数,可以在文件对象上使用.seek(amount)
,但是为了跳过多行,Python必须逐字节地遍历文件以计算换行符。
我想到的唯一选择是,如果你处理某个静态文件,那就不会改变。 在这种情况下,您可以将其编入索引一次,即找出并记住每一行的位置。 如果您在例如字典中保存并加载了pickle
,则可以使用seek
在准恒定时间内跳过它。
无法在gzip文件中随机搜索。 Gzip是一种流算法,因此必须始终从一开始就解压缩,直到您感兴趣的数据所在。
如果没有索引,则无法跳转到特定行。 可以向前扫描行,或者以连续的块从文件末尾向后扫描行。
您应该根据需要考虑不同的存储格式。 你有什么需求?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.