在Python中使用“ open()”打开文件后是否要关闭文件?[关闭]


9

关于我的上一个问题,我注意到在使用该open()函数的两个答案中都没有提到关闭文件。

我已经读到这样做是个好习惯,但是实际上是否有必要?只是不必要的代码吗?

文件会自动关闭吗?


1
with open (file_name, ...) as variable:close()离开此代码块后,将自动调用该方法。
字节指挥官


您要使用@ByteCommander给出评论作为答案,以使此问题“解决”吗?
TellMeWhy 2015年

1
在中python3,一旦没有更多引用,该文件就会自动进行垃圾回收。
Jacob Vlijm 2015年

4
我投票结束这个问题是因为没有话题,因为这是一个关于Python的普遍问题,与Ubuntu上的脚本无关。它正在询问编程语言中的最佳实践。
terdon 2015年

Answers:


9

文件什么时候关闭?

我们可以从中学到的东西明确关闭文件重要吗?(StackOverflow),在以下情况下,Python解释器将关闭文件:

  • 您可以通过离开一个块来显式或隐式地手动调用对象的close()方法。当然,这始终适用于任何Python实现。filewith open(...):
  • file对象的最后一个引用已删除,因此该对象由垃圾收集器处理。这不是语言功能,而是仅CPython实现的特殊功能,因此对于可移植性,请不要依赖于此!
  • Python解释器终止。在这种情况下,它应该关闭所有打开的文件句柄。一些旧版本的Python3还会打印警告,提示您应该自己手动关闭它们。但是,想象一下崩溃或您强行杀死​​Python解释器,您会发现这也不可靠。

因此,只有第一种(手动)方法才是可靠的!

如果文件保持打开状态会怎样?

首先,根据您的Python解释器的实现,如果您打开了具有写访问权的文件,您将无法确定修改是否已刷新到磁盘上,除非您手动诱导该文件或关闭文件处理程序。

其次,每个用户只能在系统上打开有限数量的文件。如果您超出了此限制,例如在Python程序中循环打开了多个文件而没有尽快关闭它们,则系统可能会拒绝为您打开其他文件句柄,您会收到异常消息。您的程序也可能会使用最后允许的打开文件,而另一个程序由于被拒绝而将失败。

第三,可移动设备上的打开文件会阻止其卸载或弹出。您仍然可以在诸如的某些文件系统上删除文件ext4,在该文件系统上,仅删除/取消链接到文件inode的文件描述符/硬链接,但是打开文件的程序仍可以通过其自己的临时文件处理程序访问inode。例如,这也是一种允许您在相应软件运行时更新软件包的机制。但是,例如NTFS没有这种功能。但是,它可能永远不会被两个并发进程修改,因此仍然会被其他人阻塞。


对于python3并非完全正确!
Jacob Vlijm

@JacobVlijm您介意解释吗?
字节指挥官

请参阅问题下方的评论。您答案的链接中有关“不好的做法”的答案来自2011年。如果存在,警告中的警告python3就不再存在,答案已经过时。自动垃圾回收的存在是有原因的,并且可以正常运行。自从我专门使用以来已经有好几年了close()。从来没有跑进引起不使用它一个错误。
Jacob Vlijm

如此...您知道其他实现(例如PyPy,Jython或IronPython)是否以与CPython相同的方式关闭文件?而且,如果我杀死了口译员,它将没有机会关闭文件,对吗?而且我还认为打开文件的限制仍然适用。那刷新写入的数据呢?您知道那里最新的吗?
字节司令员

1
@JacobVlijm感谢您的提示。:P创建该文件时,我的机器已经崩溃了……我什至不需要Python。
字节指挥官
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.