我正在编写一个看起来像“猫”的 Python 生成器。我的具体用例是针对“类似 grep”的操作。我希望它能够在满足条件时脱离生成器:
summary={}
for fn in cat("filelist.dat"):
for line in cat(fn):
if line.startswith("FOO"):
summary[fn] = line
break
所以当 break
发生时,我需要 cat()
生成器来完成并将文件句柄关闭到 fn
。
我必须读取总数据为 30 GB 的 100k 文件,并且 FOO
关键字出现在 header 区域,因此在这种情况下 cat()
函数尽快停止读取文件。
我还有其他方法可以解决这个问题,但我仍然想知道如何提前退出具有打开文件句柄的生成器。也许 Python 会立即清理它们并在生成器被垃圾回收时关闭它们?
谢谢,
伊恩
最佳答案
生成器有一个 close
方法,它在 yield
语句中引发 GeneratorExit
。如果您专门捕获此异常,则可以运行一些拆卸代码:
import contextlib
with contextlib.closing( cat( fn ) ):
...
然后在 cat
中:
try:
...
except GeneratorExit:
# close the file
如果你想要一个更简单的方法来做到这一点(不使用生成器上神秘的 close
方法),只需让 cat
获取一个类文件对象而不是要打开的字符串,并自己处理文件 IO:
for filename in filenames:
with open( filename ) as theFile:
for line in cat( theFile ):
...
但是,您基本上不需要担心这些,因为垃圾回收会处理所有这些。不过,
explicit is better than implicit
关于python - 如何使用打开的文件句柄中断 Python 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3637732/