如何在Python中一次读取N行文件?
我需要一次读至多N行,直到EOF读大文件。 什么是在Python中最有效的方法? 就像是:
with open(filename, 'r') as infile: while not EOF: lines = [get next N lines] process(lines)
一个解决scheme将是一个列表理解和切片运算符:
with open(filename, 'r') as infile: lines = [line for line in infile][:N]
在这lines
是lines
的元组。 但是,这会将完整的文件加载到内存中。 如果你不想要这个(也就是说,如果这个文件可能真的很大),还有另外一个解决scheme使用itertools包中的生成器expression式和islice
:
from itertools import islice with open(filename, 'r') as infile: lines_gen = islice(infile, N)
lines_gen
是一个生成器对象,它为您提供文件的每一行,并可以像下面这样循环使用:
for line in lines_gen: print line
两种解决scheme都可以提供N行(如果文件没有那么多,则可以更less)。
一个文件对象是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)
例
with open(filename) as f: for lines in grouper(f, N, ''): assert len(lines) == N # process N lines here
这个代码可以处理文件和任何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)
也许:
for x in range(N): lines.append(f.readline())
我认为你应该使用块而不是指定要读取的行数。 它使你的代码更强大和通用。 即使行很大,使用块只会将分配的数据量上传到内存中。
参考这个链接
如何循环?
with open(filename, 'r') as infile: while not EOF: lines = [] for i in range(next N lines): lines.append(infile.readline()) process(lines)
你可能需要做一些简单的事情:
lines = [infile.readline() for _ in range(N)]
更新后的评论:
lines = [line for line in [infile.readline() for _ in range(N)] if len(line) ]
如果你能提前阅读完整的文件,
infile = open(filename, 'r').readlines() my_block = [line.strip() for line in infile[:N]] cur_pos = 0 while my_block: print (my_block) cur_pos +=1 my_block = [line.strip() for line in infile[cur_pos*N:(cur_pos +1)*N]]