显式关闭文件重要吗?

显式关闭文件重要吗?

在Python中,如果您打开一个文件而不调用close(),或者关闭文件但不使用try-finally或者“with“语句,这是一个问题吗?还是依赖Python垃圾收集来关闭所有文件就足够了?例如,如果您这样做的话:

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

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


繁华开满天机
浏览 697回答 3
3回答

侃侃无极

在您的示例中,不能保证在解释器退出之前关闭该文件。在当前版本的CPython中,文件将在for循环结束时关闭,因为CPython使用引用计数作为其主要垃圾收集机制,但这是实现细节,而不是语言的特性。Python的其他实现不能保证以这种方式工作。例如,IronPython、PyPy和Jython不使用引用计数,因此不会在循环结束时关闭文件。依赖CPython的垃圾收集实现是不好的做法,因为它降低了代码的可移植性。如果使用CPython,可能不会出现资源泄漏,但是如果您曾经切换到不使用引用计数的Python实现,则需要遍历所有代码并确保所有文件都正确关闭。对于您的示例,请使用:with open("filename") as f:      for line in f:         # ... do stuff ...

哔哔one

有些Pythons在不再被引用时会自动关闭文件,而另一些则不会,当Python解释器退出时,将由O/S关闭文件。即使是为您关闭文件的Pythons,也不能保证时间:它可以是立即的,也可以是秒/分钟/小时/天之后。因此,虽然您使用的Python可能不会遇到问题,但打开文件绝对不是一个好做法。实际上,在cpython 3中,您现在会收到警告,如果不这样做,系统必须为您关闭文件。寓意:自己打扫干净。*)

慕容3067478

虽然在这种特殊情况下使用这种结构是相当安全的,但推广这种做法也有一些注意事项:Run可能会耗尽文件描述符,尽管不太可能,但想象一下这样的bug。您可能无法在某些系统上删除上述文件,例如Win 32如果您运行的是CPython以外的任何东西,则不知道何时为您关闭了文件如果以写或读-写模式打开文件,则不知道何时刷新数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python