繁体   English   中英

自定义生成器用于文件筛选

[英]Custom generator for file filter

我正在编写一个围绕open的小包装类,它将从文本文件中过滤出特定行,然后在将它们传递回用户之前将它们拆分为名称/值对。 当然,这个过程有助于使用生成器实现。

我的“文件”类

class special_file:
    def __init__(self, fname):
        self.fname = fname

    def __iter__(self):
        return self

    def __next__(self):
        return self.next()

    def next(self):
        with open(self.fname, 'r') as file:
            for line in file:
                line = line.strip()
                if line == '':
                    continue
                name,value = line.split()[0:2]
                if '%' in name:
                    continue
                yield name,value
            raise StopIteration()

用户名代码

for g in special_file('input.txt'):
    for n,v in g:
        print(n,v)

遗憾的是,我的代码有两个巨大的问题:1) special_file在真正需要返回元组时返回生成器,2)永远不会引发StopIteration()异常,因此无限期地重复读取文件 我怀疑这两个问题是相关的,但我对生成器和可迭代序列的理解相当有限。 我是否遗漏了一些关于实施发电机的痛苦明显的事情?

编辑:

我通过将第一个生成器移动到循环外部然后循环遍历它来修复我的无限读取问题。

g = special_file('input.txt')
k = next(g)
for n,v in k:
    print(n,v)

但是,我希望用户能像正常的open电话一样使用它:

for n,v in special_file('input.txt'):
    print(n,v)

在使用生成器方面,您已经实现了迭代器。 直接写出发电机。

def special_file(filename):
    with open(filename, 'r') as file:
        for line in file:
            line = line.strip()
            if line == '':
                continue
            name, value, *_ = line.split()
            if '%' in name:
                continue
            yield name, value

请参阅此处 ,了解可迭代的含义,迭代器的含义以及python使用它们的协议。

只是改变

def __iter__(self):
    return self

def __iter__(self):
    return next(self)

它按预期工作!

感谢@ Leva7的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM