Python`with`语句和文件读取生成器

时间:2015-04-07 07:28:05

标签: python generator with-statement

我有以下代码来执行普通文本文件的循环读取:

def file_reader(filename):
    with open(filename, 'rb') as f:
        while True:
            for line in f:
                yield line.strip()
            f.seek(0)

我想知道如果用户在程序执行期间某处按Ctrl+C,文件何时会关闭?

1 个答案:

答案 0 :(得分:0)

Python 可能无法关闭文件。它将被关闭,因为操作系统将在进程退出时关闭所有打开的文件句柄。

CPython可以并且在关机过程中清理生成器,但该过程不是保证,但会尽最大努力清除任何导入模块中的所有引用,从而导致引用计数降至0。

生成器对象可能被清除并调用__del__方法,然后调用generator.close(),这会抛出GeneratorExit个异常yield行,它将导致生成器退出,with语句关闭文件对象。