0

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

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

我曾经strace确保在代码执行后打开和关闭文件。

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

4

2 回答 2

4

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

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

还值得注意的是你的生成器表达式在这里什么都不做,所以我把它删除了。

于 2012-08-22T17:31:11.347 回答
1

看到这个答案。您不保留对文件对象的引用,因此在循环运行后它没有对它的引用。然后它被垃圾收集,当这种情况发生时,文件被关闭。但是,不能保证它会在循环后立即被垃圾收集。在 Python 注意到它没有被使用之前,它可能会存在一段时间。因此,最好显式关闭文件,或者甚至更好地使用with块,以便为您关闭它。

于 2012-08-22T17:33:24.900 回答