Python在文件被打开后被删除时如何读取该文件。

9

我在理解Python如何读取一个已被删除的文件时遇到了困难,以下是代码:

>>> import os
>>> os.system('cat foo.txt')
Hello world!
0
>>> f
<_io.TextIOWrapper name='foo.txt' mode='r' encoding='UTF-8'>
>>> os.system('rm -f foo.txt')
0
>>> os.system('cat foo.txt')
cat: foo.txt: No such file or directory
256
>>> f.read()
'Hello world!\n'
>>>

文本模式和二进制模式得到的结果相同。

我还尝试了读取大小超过1GB的大文件,即使在它们被删除之后也能够读取。即使是对于非常大的文件,open 函数的操作几乎是立即完成的。

如果一个打开的文件不存在了,Python 从哪里获取数据呢?

我在以下环境下进行了测试:

  • python 3.4.3 / 3.5.2
  • ubuntu 14.04 / 16.04
2个回答

8

与Python无关。在C、Fortran或Visual Cobol中,只要代码从“打开”系统调用获取其句柄,则会具有相同的行为。

在Linux / Unix系统上,一旦进程拥有文件句柄,即使文件已被删除,它也可以读取该文件。有关更多详细信息,请查看此问题(我不确定是否可以这样做,但似乎可以)

在Windows上,只要文件被进程锁定,就无法删除该文件。


4
在Linux中,目录结构和文件本身是分开的。文件由inode标识。因此,当您按名称打开文件时,会读取目录结构,查找与名称相对应的inode,然后通过inode打开文件。删除文件或重命名文件将更改目录结构,但不会影响inode。只有在关闭文件时,文件本身才会被删除,因此在目录结构和运行进程中都不会留下对inode的引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接