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

时间:2011-07-13 01:25:55

标签: python file

例如,我在文件中有2,000行,我想一次读取500行,并在读取另外500行之前对这500行进行操作。我想知道是否有人会写一些快速的代码供我学习。谢谢!

3 个答案:

答案 0 :(得分:7)

您可以使用生成器将线组合在​​一起,并以便于在简单的for循环中使用的方式生成它们。这可能会让你开始:

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行。)

修改:请务必先检查文档。这是来自the itertools docs

的食谱
def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

这会在iterable(在本例中为文件对象)上创建 n 迭代器的列表 - 因为它们都是同一底层对象上的所有迭代器,当一个进展时,其余的都将全部推进 - 然后拉开他们的结果。 izip_longest的工作方式与izip类似,但会使用fillvalue填充其结果,而不是像chunks_of函数那样简单地省略它们。

答案 1 :(得分:0)

您也可以使用itertools.islice一次读取500行:

lines = itertools.islice(file_obj, 500)

答案 2 :(得分: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)