python - 是否值得在小函数中关闭文件?

标签 python file garbage-collection

假设你有:

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 立即注意到缺少引用,并立即关闭文件”

我的函数示例几乎是一样的。你确实有一个引用,只是引用的生命周期很短。

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

最佳答案

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

即使 Python 是一种高级编程语言,您仍然需要控制自己所做的事情。根据经验:如果您打开一个文件,它也需要关闭。在你的代码中没有任何理由草率 :-)

关于你的第二个问题:它不会立即运行,它会在垃圾收集器决定运行时运行。当文件对象被释放时,Python 将关闭该文件。这里是some articles关于 Python 中的垃圾收集(另请参阅 gc 模块),这是一本有趣的读物。

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

关于python - 是否值得在小函数中关闭文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11409345/

相关文章:

c# - 将结构传递到接口(interface)字段是否分配?

python - Tensorflow 和 Keras 的迁移学习问题

python - 使用 GRequest 无法实现异步请求

javascript - 如何在没有 promise 的情况下在异步函数中读取文件?

file - Windows .testcaferc.json 文件的位置

java - 当我使用套接字时垃圾收集器循环

Java 7 无法收集由 Java 5 收集的永久代

python - TypeError : dst is not a numpy array, 都不是标量 - 调整 jpg python 大小

Python 子进程 Popen : Why does "ls *.txt" not work?

python - 使用 Python 验证保存的文本文件以检查参数是否设置