在 Python 中需要使用 `open()` 打开文件后关闭文件吗?

Tel*_*Why 11 python files io

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

我已经读到这样做是一种很好的做法,但实际上是否有必要这样做?它只是不必要的代码吗?

文件会自动关闭吗?

Byt*_*der 11

文件什么时候关闭?

正如我们可以从明确关闭文件重要吗?(StackOverflow),Python 解释器会在以下情况下关闭文件:

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

所以只有第一种(手动)方法是可靠的!

如果文件保持打开状态会发生什么?

首先,根据你的 Python 解释器的实现,如果你打开一个具有写访问权限的文件,你不能确保你的修改被刷新到磁盘,直到你手动诱导它或文件处理程序被关闭。

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

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