Python如何一次读取N行

bro*_*ter 44 python lines python-itertools

我正在编写一个代码,一次取一个巨大的文本文件(几GB)N行,处理该批处理,并移动到下一行N行,直到我完成整个文件.(我不在乎最后一批是不是完美的尺寸).

我一直在阅读有关使用itertools islice进行此操作的信息.我想我在那里:

from itertools import islice
N = 16
infile = open("my_very_large_text_file", "r")
lines_gen = islice(infile, N)

for lines in lines_gen:
     ...process my lines...
Run Code Online (Sandbox Code Playgroud)

麻烦的是我想处理下一批16行,但我遗漏了一些东西

Sve*_*ach 56

islice()可用于获取n迭代器的下一项.因此,list(islice(f, n))将返回n文件的下一行列表f.在循环中使用它将为您提供大量n行的文件.在文件的末尾,列表可能会更短,最后调用将返回一个空列表.

from itertools import islice
with open(...) as f:
    while True:
        next_n_lines = list(islice(f, n))
        if not next_n_lines:
            break
        # process next_n_lines
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用石斑鱼图案:

with open(...) as f:
    for next_n_lines in izip_longest(*[f] * n):
        # process next_n_lines
Run Code Online (Sandbox Code Playgroud)

  • @zengr:您必须将计数器存放在某个地方。这是一个完全不相关的问题——使用右上角的“提问”按钮。 (2认同)

msw*_*msw 7

问题似乎是假设通过一次读取N行的块中的"巨大文本文件"可以获得效率.这为已经高度优化的stdio库增加了一个缓冲应用层,增加了复杂性,并且可能绝对没有给你买任何东西.

从而:

with open('my_very_large_text_file') as f:
    for line in f:
        process(line)
Run Code Online (Sandbox Code Playgroud)

在时间,空间,复杂性和可读性方面可能优于任何替代方案.

另见Rob Pike的前两条规则,Jackson的两条规则,以及PEP-20的Python之禅.如果你真的只想和islice你一起玩,你应该省去大文件.

  • 你好!我必须以 N 行块的形式处理巨大的文本文件的原因是,我从每组 N 中选择一个随机行。这是用于生物信息学分析,我想制作一个较小的文件,该文件具有与整个数据集。生物学中并非所有数据都是平等创建的!可能有一种不同的(也许更好?)的方法来从巨大的数据集中选择均匀分布的 X 条随机线,但这是我首先想到的。感谢您的链接! (2认同)