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)
问题似乎是假设通过一次读取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
你一起玩,你应该省去大文件.
归档时间: |
|
查看次数: |
40995 次 |
最近记录: |