python - 如何使用打开的文件句柄中断 Python 生成器

标签 python generator break

我正在编写一个看起来像“猫”的 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/

相关文章:

python - Flask-SQLAlchemy 和 Flask-ReSTLess 不取孙子

python - kubernetes python 客户端在使用 watch.stream 方法运行时被挂起

python - Pandas 箱线图

python - int 字典与 string 字典以减少大小

javascript - 为什么生成器中的console.logs按这样的顺序出现?

.net - 多线程Random.NextDouble()

python - Python 中的惰性进程池执行器?

c - C语言什么时候用break,continue?

android - 避免在 TextView 中的特定位置换行

c++ - 使用用户输入停止倒数计时器