mad*_*mer 30 python file-io iterator
我需要一次读取最多N行读取一个大文件,直到EOF.在Python中最有效的方法是什么?就像是:
with open(filename, 'r') as infile:
while not EOF:
lines = [get next N lines]
process(lines)
Run Code Online (Sandbox Code Playgroud)
Mar*_*rau 34
一个解决方案是列表理解和切片运算符:
with open(filename, 'r') as infile:
lines = [line for line in infile][:N]
Run Code Online (Sandbox Code Playgroud)
在此之后lines
是行元组.但是,这会将整个文件加载到内存中.如果您不想这样(即文件可能非常大),还有另一种使用生成器表达式和islice
itertools包的解决方案:
from itertools import islice
with open(filename, 'r') as infile:
lines_gen = islice(infile, N)
Run Code Online (Sandbox Code Playgroud)
lines_gen
是一个生成器对象,它为您提供文件的每一行,并可以在这样的循环中使用:
for line in lines_gen:
print line
Run Code Online (Sandbox Code Playgroud)
这两种解决方案最多可以提供N行(如果文件没有那么多,则会更少).
jfs*_*jfs 13
文件对象是Python中的行上的迭代器.要一次遍历文件N行,你可以使用grouper()itertools的配方(参见什么是最"pythonic"方式迭代块中的列表?):
#!/usr/bin/env python2
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return izip_longest(*args, fillvalue=fillvalue)
Run Code Online (Sandbox Code Playgroud)
with open(filename) as f:
for lines in grouper(f, N, ''):
assert len(lines) == N
# process N lines here
Run Code Online (Sandbox Code Playgroud)
此代码适用于文件和任何行中的任何行数N
.如果你有1100 lines
文件N = 200
,你会得到5次处理200行的块和100行的一次.
with open(filename, 'r') as infile:
lines = []
for line in infile:
lines.append(line)
if len(lines) >= N:
process(lines)
lines = []
if len(lines) > 0:
process(lines)
Run Code Online (Sandbox Code Playgroud)