在Python语言中,如果不调用close()
就打开文件,或者不使用try
-finally
或"with
“语句关闭文件,这会有问题吗?或者,依赖Python垃圾收集来关闭所有文件作为编码实践就足够了吗?例如,如果有人这样做:
for line in open("filename"):
# ... do stuff ...
..。这是不是一个问题,因为文件永远不会被关闭,并且可能会发生阻止其关闭的异常?或者它一定会在for
语句结束时关闭,因为文件超出了作用域?
发布于 2011-09-13 10:00:38
在您的示例中,不能保证在解释器退出之前关闭该文件。在当前版本的CPython中,该文件将在for循环结束时关闭,因为CPython使用引用计数作为其主要的垃圾收集机制,但这是实现细节,而不是该语言的特性。Python的其他实现不能保证以这种方式工作。例如,IronPython、PyPy和Jython不使用引用计数,因此不会在循环结束时关闭文件。
依赖CPython的垃圾收集实现是一种糟糕的做法,因为它会降低代码的可移植性。如果您使用CPython,您可能不会有资源泄漏,但如果您切换到不使用引用计数的Python实现,您将需要检查所有代码,并确保所有文件都已正确关闭。
对于您的示例,请使用:
with open("filename") as f:
for line in f:
# ... do stuff ...
发布于 2011-09-13 09:39:01
一些Python会在文件不再被引用时自动关闭文件,而另一些则不会,当Python解释器退出时,由操作系统来关闭文件。
即使对于将为您关闭文件的Python,时间也不能保证:可能是立即关闭,也可能是几秒/分钟/小时/天后。
因此,尽管您使用的Python可能不会遇到问题,但让您的文件保持打开状态肯定不是一种好的做法。事实上,在cpython3中,如果你不这样做,你会得到警告,系统必须为你关闭文件。
寓意:把自己清理干净。:)
发布于 2011-09-13 08:33:22
该文件确实被垃圾回收,因此被关闭。GC决定它何时关闭,而不是您。显然,这不是推荐的做法,因为如果您不在使用完文件后立即关闭文件,则可能会达到打开文件句柄限制。如果在您的for
循环中打开更多的文件,并让它们继续存在,会发生什么呢?
https://stackoverflow.com/questions/7395542
复制相似问题