首页 > 解决方案 > 如何遍历同一个打开文件的两个生成器

问题描述

我有一个中等大小的文件(25MB,1000000 行),我想读取除每三行之外的每一行。

第一个问题:将整个文件加载到内存中然后读取行(方法.read())或一次加载并读取一行(方法)是否更快.readline()

由于我不是经验丰富的编码员,因此我尝试了使用模块中的islice方法的第二个选项。itertools

import intertools

with open(input_file) as inp:
    inp_atomtype = itertools.islice(inp, 0, 40, 3)
    inp_atomdata = itertools.islice(inp, 1, 40, 3)
    for atomtype, atomdata in itertools.zip_longest(inp_atomtype, inp_atomdata):
        print(atomtype + atomdata)

虽然循环通过单个生成器(inp_atomtypeinp_atomdata)打印正确的数据,但同时循环通过它们(如在此代码中)会打印错误的数据。

第二个问题:如何使用生成器达到所需的行?

标签: pythongeneratoritertools

解决方案


您不需要对迭代器进行切片,一个简单的行计数器就足够了:

with open(input_file) as f:
    current_line = 0
    for line in f:
        current_line += 1
        if current_line % 3:  # ignore every third line
            print(line)  # NOTE: print() will add an additional new line by default

至于把它变成一个生成器,只是yield行而不是打印。

在速度方面,考虑到您无论如何都会读取您的行,I/O 部分可能会花费相同的时间,但如果您有足够的数量,您可能会从快速列表切片而不是计数行中受益一点(总处理时间)工作内存来保存文件内容,如果预先加载整个文件而不是流式传输是可以接受的。


推荐阅读