如果我执行以下操作,文件句柄会在Python中超出范围时自动关闭:
def read_contents(file_path):
return file(file_path).read()
如果没有,我该怎么写这个函数来自动关闭范围?
答案 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。