簡體   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