如果我这样做(在Python中):
text = open("filename").read()
是自动关闭的文件吗?
答案 0 :(得分:6)
垃圾收集器会在某个时刻被激活,但除非你强迫它,否则你无法确定它。
确保在超出范围时关闭文件的最佳方法是:
with open("filename") as f: text = f.read()
也是单线但更安全。
答案 1 :(得分:3)
在CPython(参考Python实现)中,文件将自动关闭。 CPython一旦没有引用就会销毁对象,这最迟发生在语句的末尾。
在其他Python实现中,这可能不会马上发生,因为它们可能依赖于底层虚拟机的内存管理,或完全使用其他内存管理策略(参见PyParallel有趣的例子)。
Python,这种语言,没有指定任何特定形式的内存管理,因此您不能依赖于在一般情况下关闭的文件。如果您需要依赖它,请使用with
语句明确指定何时关闭它。
在实践中,我经常在短期脚本中使用这种方法,在文件关闭时并不重要。
答案 2 :(得分:2)
由于您没有关于打开文件句柄的引用,
CPython将在垃圾收集或程序退出期间自动关闭它。这里的问题是你没有任何关于何时会发生这种情况的保证,这就是首选with open(...)
结构的原因。