8

假设你有:

def my_func():
    fh = open(...)
    try:
        print fh.read()
    finally:
        fh.close()

我的第一个问题是:使用 try/finally(或 with)语句是否值得?当函数终止时(通过垃圾收集),文件是否仍然关闭?

在阅读了 Martelli 的“python 食谱”中的食谱后,我发现了这一点

all_the_text = open('thefile.txt').read()

附带评论:“当你这样做时,一旦读取操作完成,你就不再拥有对文件对象的引用。实际上,Python 会立即注意到缺少引用,并立即关闭文件。”

我的函数示例几乎相同。您确实有参考,只是参考的寿命很短。

我的第二个问题是:马尔泰利声明中的“立即”是什么意思?即使您根本没有参考,文件关闭也不会在垃圾收集时发生吗?

4

1 回答 1

12

最好自己关闭文件。使用该with语句可以生成干净的代码并自动关闭文件(这是一件好事)。

即使 Python 是一种高级编程语言,您仍然需要控制自己在做什么。根据经验:如果您打开一个文件,它也需要关闭。没有充分的理由在您的代码中马虎:-)

关于你的第二个问题:它不会立即运行,它会在垃圾收集器决定运行时运行。当文件对象被释放时,Python 将关闭文件。这里有一些关于 Python 垃圾收集的 文章(另见gc模块),读起来很有趣。

它还表明 Python 的垃圾收集在决定进行垃圾收集之前使用了一个基于已分配和已释放对象数量的阈值。如果你的文件很大,那么 Python 可能会保持文件打开的时间超过必要的时间,因为垃圾收集代码可能还没有运行。

于 2012-07-10T08:27:20.400 回答