评估生成器表达式后,文件将关闭

时间:2012-08-22 17:29:13

标签: python generator

假设我有一个文件test.txt并想要打印内容。我可以在Python中这样做(这只是一个例子来说明我的问题,而不是一个好代码的例子):

for i in (line for line in open('test.txt')):
    print ">", i,

我使用strace来确保在代码执行后打开和关闭文件。

问题:文件为何关闭?我想它与上下文管理器有关,但我找不到对这种结构的任何引用以及为什么文件会自动关闭。谁知道幕后发生了什么,可以解释一下?

2 个答案:

答案 0 :(得分:3)

当对文件的引用超出范围时,它将被垃圾收集,并作为被删除的一部分关闭。由于您没有将文件分配给名称,因此一旦循环结束,它就会超出范围。然而,这并不是一件好事。请改用实际的上下文管理器,例如:

with open('test.txt') as f:
    for i in f:
        print(">", i, end="")

值得注意的是,你的生成器表达式在这里什么也没做,所以我已经删除了它。

答案 1 :(得分:1)

this answer。您没有保留对文件对象的引用,因此在循环运行后它没有对它的引用。然后进行垃圾回收,当发生这种情况时,文件将被关闭。但是,无法保证在循环后立即收集垃圾。在Python注意到它没有被使用之前,它可能会闲置一段时间。因此,最好明确关闭文件,或者更好的是,使用with块,以便它为您关闭。