首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >显式关闭文件重要吗?

显式关闭文件重要吗?
EN

Stack Overflow用户
提问于 2011-09-13 08:27:08
回答 5查看 78.1K关注 0票数 168

在Python语言中,如果不调用close()就打开文件,或者不使用try-finally或"with“语句关闭文件,这会有问题吗?或者,依赖Python垃圾收集来关闭所有文件作为编码实践就足够了吗?例如,如果有人这样做:

代码语言:javascript
复制
for line in open("filename"):
    # ... do stuff ...

..。这是不是一个问题,因为文件永远不会被关闭,并且可能会发生阻止其关闭的异常?或者它一定会在for语句结束时关闭,因为文件超出了作用域?

EN

回答 5

Stack Overflow用户

发布于 2011-09-13 10:00:38

在您的示例中,不能保证在解释器退出之前关闭该文件。在当前版本的CPython中,该文件将在for循环结束时关闭,因为CPython使用引用计数作为其主要的垃圾收集机制,但这是实现细节,而不是该语言的特性。Python的其他实现不能保证以这种方式工作。例如,IronPython、PyPy和Jython不使用引用计数,因此不会在循环结束时关闭文件。

依赖CPython的垃圾收集实现是一种糟糕的做法,因为它会降低代码的可移植性。如果您使用CPython,您可能不会有资源泄漏,但如果您切换到不使用引用计数的Python实现,您将需要检查所有代码,并确保所有文件都已正确关闭。

对于您的示例,请使用:

代码语言:javascript
复制
with open("filename") as f:
     for line in f:
        # ... do stuff ...
票数 140
EN

Stack Overflow用户

发布于 2011-09-13 09:39:01

一些Python会在文件不再被引用时自动关闭文件,而另一些则不会,当Python解释器退出时,由操作系统来关闭文件。

即使对于将为您关闭文件的Python,时间也不能保证:可能是立即关闭,也可能是几秒/分钟/小时/天后。

因此,尽管您使用的Python可能不会遇到问题,但让您的文件保持打开状态肯定不是一种好的做法。事实上,在cpython3中,如果你不这样做,你会得到警告,系统必须为你关闭文件。

寓意:把自己清理干净。:)

票数 27
EN

Stack Overflow用户

发布于 2011-09-13 08:33:22

该文件确实被垃圾回收,因此被关闭。GC决定它何时关闭,而不是您。显然,这不是推荐的做法,因为如果您不在使用完文件后立即关闭文件,则可能会达到打开文件句柄限制。如果在您的for循环中打开更多的文件,并让它们继续存在,会发生什么呢?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7395542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档