Python 2.7:如何从文件中一次读取几行?

2 投票
3 回答
1459 浏览
提问于 2025-04-16 21:23

比如说,我有一个文件里面有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函数那样简单地省略它们。

撰写回答