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

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

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

我读到过,这样做是很好的做法,但真的有必要吗?这只是不必要的代码吗?

文件会自动关闭吗?

答案1

文件什么时候关闭?

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

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

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

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

首先,根据您的 Python 解释器的实现,如果您打开了一个具有写访问权限的文件,则您不能确定您的修改是否已被刷新到磁盘,直到您手动触发它或文件处理程序关闭。

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

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

相关内容