假设我有一个文件test.txt
并想要打印内容。我可以在Python中这样做(这只是一个例子来说明我的问题,而不是一个好代码的例子):
for i in (line for line in open('test.txt')):
print ">", i,
我使用strace
来确保在代码执行后打开和关闭文件。
问题:文件为何关闭?我想它与上下文管理器有关,但我找不到对这种结构的任何引用以及为什么文件会自动关闭。谁知道幕后发生了什么,可以解释一下?
答案 0 :(得分:3)
当对文件的引用超出范围时,它将被垃圾收集,并作为被删除的一部分关闭。由于您没有将文件分配给名称,因此一旦循环结束,它就会超出范围。然而,这并不是一件好事。请改用实际的上下文管理器,例如:
with open('test.txt') as f:
for i in f:
print(">", i, end="")
值得注意的是,你的生成器表达式在这里什么也没做,所以我已经删除了它。
答案 1 :(得分:1)
见this answer。您没有保留对文件对象的引用,因此在循环运行后它没有对它的引用。然后进行垃圾回收,当发生这种情况时,文件将被关闭。但是,无法保证在循环后立即收集垃圾。在Python注意到它没有被使用之前,它可能会闲置一段时间。因此,最好明确关闭文件,或者更好的是,使用with
块,以便它为您关闭。