Python GC 也会关闭文件吗?

Vla*_*ykh 1 python garbage-collection file

考虑以下 Python (2.x) 代码:

for line in open('foo').readlines():
    print line.rstrip()
Run Code Online (Sandbox Code Playgroud)

我认为由于打开的文件仍未被引用,因此必须自动关闭。我已经阅读了 Python 中的垃圾收集器,它可以释放未使用对象分配的内存。GC 是否足够通用来处理文件?

Fly*_*ler 5

取自文档(python 3.6):

如果您没有使用 with 关键字,那么您应该调用 f.close() 来关闭文件并立即释放它使用的所有系统资源。如果您没有明确关闭文件,Python 的垃圾收集器最终会销毁该对象并为您关闭打开的文件,但该文件可能会保持打开状态一段时间。另一个风险是不同的 Python 实现会在不同的时间进行这种清理。

所以是的,该文件将自动关闭,但为了控制该过程,您应该自己这样做或使用以下with语句:

with open('foo') as foo_file:
    for line in foo_file.readlines():
        print line.rstrip()
Run Code Online (Sandbox Code Playgroud)

foo_file一旦with块结束,将被关闭

在 python 2.7 docs 中,措辞有所不同:

完成文件后,调用 f.close() 关闭它并释放打开文件占用的所有系统资源。调用 f.close() 后,尝试使用文件对象将自动失败。

所以我假设您不应该依赖垃圾收集器自动为您关闭文件而只需手动/使用 with