[英]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.