Python中,文件句柄超出作用域后会自动关闭吗?

27 投票
2 回答
12770 浏览
提问于 2025-04-15 20:10

如果我这样做,文件句柄在Python中会自动关闭吗,因为它超出了作用域:

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

如果不会,那我该怎么写这个函数才能让它自动关闭呢?

2 个回答

42

为了更好地理解FogleBird的回答,如果你不明确地关闭文件,那么当文件对象被销毁时,文件会自动关闭。在CPython中,这种情况会发生在没有更多引用指向它的时候,比如说如果它是一个函数里的局部变量,当这个函数结束时,文件就会关闭。不过,如果在函数中抛出了异常,而没有使用with语句或try:...finally:来明确关闭文件,那么文件的引用会保留在错误追踪信息中,这样文件就不会关闭,至少在下一个异常被抛出之前是这样。

另外,IronPython和Jython分别使用了.Net CLR和Java JVM的垃圾回收机制。这些机制不是通过引用计数来管理的,所以文件会一直保持打开状态,直到垃圾回收器决定回收这个对象的内存,或者程序结束。

所以一般来说,使用with:try:...finally:来明确关闭文件是很重要的。

当然,这些道理同样适用于任何其他需要明确清理的对象。

21

应该在文件的 __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

撰写回答