![在 Python 中,使用 `open()` 打开文件后是否需要关闭文件?](https://linux22.com/image/877664/%E5%9C%A8%20Python%20%E4%B8%AD%EF%BC%8C%E4%BD%BF%E7%94%A8%20%60open()%60%20%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%E5%90%8E%E6%98%AF%E5%90%A6%E9%9C%80%E8%A6%81%E5%85%B3%E9%97%AD%E6%96%87%E4%BB%B6%EF%BC%9F.png)
答案1
文件什么时候关闭?
我们可以从中学到明确关闭文件重要吗?(StackOverflow),Python解释器在下列情况下关闭文件:
- 你可以通过离开一个块来手动显式或隐式地调用对象
close()
的方法。这当然在任何 Python 实现上都有效。file
with open(...):
- 对象
file
的最后一个引用被删除,因此对象被垃圾收集器处理。这不是语言功能,而是 CPython 实现的特殊功能,因此为了可移植性,不要依赖它! - Python 解释器终止。在这种情况下,它应该关闭所有已打开的文件句柄。一些较旧的 Python3 版本还会打印一条警告,提示您应该手动关闭它们。但是,想象一下崩溃或您强制关闭 Python 解释器,您会发现这也不可靠。
所以只有第一种(手动)方法是可靠的!
如果文件保持打开状态会发生什么情况?
首先,根据您的 Python 解释器的实现,如果您打开了一个具有写访问权限的文件,则您不能确定您的修改是否已被刷新到磁盘,直到您手动触发它或文件处理程序关闭。
其次,每个用户只能在系统上打开有限数量的文件。如果您超出此限制,例如在 Python 程序中循环打开许多文件而不尽快关闭它们,系统可能会拒绝为您打开更多文件句柄,并且您会收到异常。还可能发生这样的情况:您的程序占用了最后一个允许打开的文件,而另一个程序会因为被拒绝而失败。
第三,可移动设备上打开的文件会阻止其卸载或弹出。您仍可在某些文件系统(如)上删除文件ext4
,其中只是删除/取消链接文件 inode 的文件描述符/硬链接,但打开文件的程序仍可通过其自己的临时文件处理程序访问 inode。例如,这也是允许您在相应软件运行时更新软件包的机制。但是,例如 NTFS 没有这样的功能。但它可能永远不会被两个并发进程修改,因此它仍会以某种方式被其他进程阻止。