为了账号安全,请及时绑定邮箱和手机立即绑定

显式关闭文件重要吗?

显式关闭文件重要吗?

繁华开满天机 2019-06-20 10:15:14
显式关闭文件重要吗?在Python中,如果您打开一个文件而不调用close(),或者关闭文件但不使用try-finally或者“with“语句,这是一个问题吗?还是依赖Python垃圾收集来关闭所有文件就足够了?例如,如果您这样做的话:for line in open("filename"):     # ... do stuff .....这是否是一个问题,因为文件永远无法关闭,并且可能会发生异常,从而阻止它被关闭?或者它一定会在结束时关闭。for语句,因为文件超出了作用域?
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

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

依赖CPython的垃圾收集实现是不好的做法,因为它降低了代码的可移植性。如果使用CPython,可能不会出现资源泄漏,但是如果您曾经切换到不使用引用计数的Python实现,则需要遍历所有代码并确保所有文件都正确关闭。

对于您的示例,请使用:

with open("filename") as f:
     for line in f:
        # ... do stuff ...


查看完整回答
反对 回复 2019-06-20
?
哔哔one

TA贡献1854条经验 获得超8个赞

有些Pythons在不再被引用时会自动关闭文件,而另一些则不会,当Python解释器退出时,将由O/S关闭文件。

即使是为您关闭文件的Pythons,也不能保证时间:它可以是立即的,也可以是秒/分钟/小时/天之后。

因此,虽然您使用的Python可能不会遇到问题,但打开文件绝对不是一个好做法。实际上,在cpython 3中,您现在会收到警告,如果不这样做,系统必须为您关闭文件。

寓意:自己打扫干净。*)


查看完整回答
反对 回复 2019-06-20
?
慕容3067478

TA贡献1773条经验 获得超3个赞

虽然在这种特殊情况下使用这种结构是相当安全的,但推广这种做法也有一些注意事项:

  • Run可能会耗尽文件描述符,尽管不太可能,但想象一下这样的bug。
  • 您可能无法在某些系统上删除上述文件,例如Win 32
  • 如果您运行的是CPython以外的任何东西,则不知道何时为您关闭了文件
  • 如果以写或读-写模式打开文件,则不知道何时刷新数据。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 696 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信