python - 如何使用 "chain"迭代器?

标签 python iterator

<分区>

我正在尝试将迭代器链接在一起,其中一个迭代器从主文件读取,另一个迭代器获取主文件的每一行并根据第一个文件的输出处理另一个文件。

我的工作代码如下

class MasterReader(object):

    def __init__(self, filename):
        self.f = open(filename, "r")

    def __iter__(self):
        return self

    def __next__(self):
        line = self.f.readline().strip()
        if line == "":
            raise StopIteration
        return line


class SubReader(object):

    def __init__(self, mr):
        self.mr = mr

    def __iter__(self):
        self._next()
        return self

    def _next(self):
        self.current = open(self.mr.__next__(), "r")

    def __next__(self):
        while True:
            line = self.current.readline().strip()
            if line == "":
                self._next()
                continue
            return line


mr = MasterReader("master")
sr = SubReader(mr)

for line in sr:
    print(line)

其中 master 是一个包含多行其他文件的文件

file1
file2

file1 包含

1.a
1.b
1.c

file2 包含

2.a
2.b
2.c

输出是

1.a
1.b
1.c
2.a
2.b
2.c

再次,我所做的工作,但感觉不对,因为我在 __next__ 中有一个 while 循环,我必须手动检查每个子文件的末尾,并且显式调用 master 文件中的下一行。

是否有更好/更 pythonic 的方式来做到这一点?

编辑: 这是我要完成的一个简化问题。在实际版本中,SubReader 将被线程化,我只需要一个 MasterReader。实际上,这对我的线程项目不起作用,但我想确保在深入研究困惑之前泛化迭代器。

最佳答案

您可以在小函数的帮助下使用 itertools.chain.from_iterable 生成每个文件中的剥离行。

from itertools import chain

def fgen(fname):
    with open(fname) as f:
        for line in f:
            yield line.strip()

for a in chain.from_iterable(fgen(line) for line in fgen('master.txt')):
    print(a)

关于python - 如何使用 "chain"迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45850493/

相关文章:

iterator - 如何在不收集到临时向量的情况下对结果的迭代器执行迭代器计算?

c++ - 指针列表 C++

python - "Group"行基于一列,然后为现有其他列值的可能组合创建新列

python - 使用 pywinauto 从 TreeView 中选择子项

c++ - 访问 vector 的最后一个元素的地址的有效方法

javascript - Jquery .each() 无限循环

java - 使用LinkedList的迭代器打印值,在java中不断陷入无限循环

c++ - 文档示例中的 Cython 崩溃

python - 我想替换字母/单词,但我在代码的一方面面临挑战

python - 在单行中总结 pandas 数据框