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

bod*_*ydo 22 python scope file

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

def read_contents(file_path):
  return file(file_path).read()
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*rby 35

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

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

所以一般使用显式关闭该文件是很重要的with:还是try:...finally:.

当然,对于需要显式清理的任何其他类型的对象,所有这些都适用.

  • 另请注意:在 Python 3 中,“文件不会被关闭,至少在下一个异常被抛出之前”不再准确;在 Python 3 中,引发新异常隐式链接异常上下文,因此如果您捕获一个异常并引发一个新异常,则原始异常的回溯将保留在新异常中(除非它们明确禁用上下文,例如引发`from无`)。在 Py 2 和 3 中,通过回溯创建循环垃圾相当容易;即使不再引用异常,您最终也会等待循环 GC 被清除,就像 Jython 一样。 (2认同)

Fog*_*ird 20

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

def read_contents(file_path):
  with open(file_path, 'r') as f:
    return f.read()
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见http://docs.python.org/library/stdtypes.html#file.close.