说你有:
def my_func():
fh = open(...)
try:
print fh.read()
finally:
fh.close()
我的第一个问题是:是否值得使用try / finally(或with)语句?当函数终止时(通过垃圾收集),文件是否仍然关闭?
我在阅读了Martelli的“蟒蛇食谱”中的食谱后发现了这一点
all_the_text = open('thefile.txt').read()
附带注释:“当您这样做时,一旦读取操作完成,您就不再具有对文件对象的引用。实际上,Python会立即注意到缺少引用,并立即关闭文件。“
我的功能示例几乎相同。你有一个参考,只是参考的寿命非常短。
我的第二个问题是:Martelli声明中的“立即”是什么意思?即使您根本没有引用,但是文件关闭是否仍然发生在垃圾收集时间?
答案 0 :(得分:12)
最好自己关闭文件。使用with
语句可以获得干净的代码,并自动关闭文件(这是一件好事)。
尽管Python是一种高级编程语言,但您仍然需要掌控自己正在做的事情。根据经验:如果您打开文件,也需要关闭它。你的代码中没有充分的理由: - )
关于你的第二个问题:它不会立即运行,它会在垃圾收集器决定运行时运行。当文件对象被释放时,Python将关闭该文件。以下是关于Python中垃圾收集的some articles(另请参阅gc
模块),这是一个有趣的读物。
它还表明Python的垃圾收集在决定垃圾收集之前使用基于已分配和解除分配对象数量的阈值。如果您的文件很大,那么Python可能会将文件打开的时间超过必要的时间,因为垃圾收集代码可能尚未运行。