python - 明确关闭文件重要吗?

标签 python file garbage-collection

在 Python 中,如果您打开文件而不调用 close(),或者关闭文件但不使用 try-finally 或"with"语句,这是一个问题吗?还是仅依靠 Python 垃圾收集来关闭所有文件作为编码实践就足够了?例如,如果有人这样做:

for line in open("filename"):
    # ... do stuff ...

...这是一个问题,因为文件永远无法关闭并且可能会发生阻止它关闭的异常?或者它肯定会因为文件超出范围而在 for 语句结束时关闭吗?

最佳答案

在您的示例中,不能保证在解释器退出之前关闭文件。在当前版本的 CPython 中,文件将在 for 循环结束时关闭,因为 CPython 使用引用计数作为其主要的垃圾收集机制,但这是一个实现细节,而不是该语言的一个特性。不保证其他 Python 实现以这种方式工作。例如 IronPython、PyPy 和 Jython 不使用引用计数,因此不会在循环结束时关闭文件。

依赖 CPython 的垃圾回收实现是一种不好的做法,因为它会降低您的代码的可移植性。如果您使用 CPython,您可能没有资源泄漏,但如果您切换到不使用引用计数的 Python 实现,您将需要检查所有代码并确保所有文件都正确关闭。

对于您的示例使用:

with open("filename") as f:
     for line in f:
        # ... do stuff ...

关于python - 明确关闭文件重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56147460/

相关文章:

c# - Expression<TDelegate>.Compile 和垃圾收集

python - python变量继承是如何工作的?

python - OPENCV:以可变帧速率提取视频中帧的生命周期

python - 想要每个月的最后一天作为 pandas 中的数据框

php - 从文本文件中读取数据 PHP

c# - 我如何判断 .Net 3.5 垃圾收集器是否已运行?

python - 在 DataFrame 上应用 .value_counts(),并在每个单元格中填充列表

C#:在没有管理权限的情况下从文件中删除只读属性

java - 在 netbeans 中打开文件

c# - .NET对象事件和处置/GC