文件句柄在超出范围后是否会在Python中自动关闭?

时间:2010-03-08 20:18:51

标签: python file scope

如果我执行以下操作,文件句柄会在Python中超出范围时自动关闭:

def read_contents(file_path):
  return file(file_path).read()

如果没有,我该怎么写这个函数来自动关闭范围?

2 个答案:

答案 0 :(得分:33)

要扩展FogleBird的答案,如果您没有明确关闭它,那么当文件对象被销毁时,文件将自动关闭。在CPython中,只要没有对它的引用,就会发生这种情况。如果它是函数中的局部变量,则函数结束。但是,如果函数中抛出异常并且未使用with语句或try:...finally:显式关闭文件,则对该文件的引用将作为traceback对象中堆栈跟踪的一部分保留,该文件不会被关闭,至少在抛出下一个异常之前。

IronPython和Jython也分别使用.Net CLR和Java JVM的垃圾收集工具。这些不是引用计数,因此文件将无限期保持打开,直到垃圾收集器决定回收对象的内存或程序终止。

因此,一般情况下,使用with:try:...finally:明确关闭文件非常重要。

当然,对于需要显式清理的任何其他类型的对象,这一切都适用。

答案 1 :(得分:20)

它应该关闭文件__del__语句中的文件句柄,但更好的方法是使用with块:

def read_contents(file_path):
  with open(file_path, 'r') as f:
    return f.read()

有关详细信息,请参阅http://docs.python.org/library/stdtypes.html#file.close