繁体   English   中英

python跳转到txt文件中的一行(一个gzipped)

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

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