如何在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] 

在这lineslines的元组。 但是,这会将完整的文件加载到内存中。 如果你不想要这个(也就是说,如果这个文件可能真的很大),还有另外一个解决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]]