Python 2.7:如何从文件中一次读取几行?
比如说,我有一个文件里面有2000行内容,我想一次读取500行,然后对这500行做点事情,之后再读取下一组500行。我想知道有没有人能给我写点简单的代码让我学习一下。谢谢!
3 个回答
0
请纠正我,如果我错了的话,我觉得这个非常简单的例子也能正常工作:
linesToProceed = 500
with open(filename, 'r') as f:
lines = []
for i,line in enumerate(f):
if (i + 1) % linesToProceed:
# do something with lines in lines
lines = []
else:
lines.append(line)
0
你也可以使用 itertools.islice
这个工具,每次读取500行内容:
lines = itertools.islice(file_obj, 500)
7
你可以使用生成器把行分组,然后以一种方便的方式在简单的循环中使用它。这个可以帮助你入门:
def chunks_of(iterable, chunk_size=500):
out = []
for item in iterable:
out.append(item)
if len(out) >= chunk_size:
yield out
out = []
if out:
yield out
然后你可以这样使用它:
for chunk_of_lines in chunks_of(file('/path/to/file'), chunk_size=500):
# chunk_of_lines is 500 or fewer lines from the file
(为什么是“500行或更少”?因为最后一组可能不是500行,如果文件中的行数不是500的整数倍的话。)
编辑:总是先查看文档。这是来自 itertools文档的一个示例
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
这段代码创建了一个包含n个迭代器的列表,这些迭代器都是基于同一个可迭代对象(在这个例子中是文件对象)-- 由于它们都是基于同一个底层对象的迭代器,当一个迭代器向前移动时,其他的也会一起移动-- 然后将它们的结果合并在一起。izip_longest
的工作方式类似于izip
,但它会用fillvalue
来填充结果,而不是像我的chunks_of
函数那样简单地省略它们。