Python 如何读取打开后删除的文件
How Python reads a file when it was deleted after being opened
我很难理解 Python 在 open
编辑后删除文件时如何读取文件的概念。这是代码:
>>> 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
与 Python 无关。在 C、Fortran 或 Visual Cobol 中,只要代码从 open
系统调用中获取句柄,您就会有相同的行为。
在 Linux/Unix 系统上,一旦进程拥有文件句柄,它就可以读取它,即使文件已被删除。有关更多详细信息,请查看 that question(我不确定是否可以这样做,似乎是)
在 Windows 上,只要文件被进程锁定,您就无法删除它。
在Linux,目录结构和文件本身是分开的。该文件由 inode 标识。所以当你按名称打开文件时,你读取目录结构,找到一个对应名称的inode,然后按inode打开文件。删除文件或重命名文件会改变目录结构,但不会影响 inode。文件本身只有在您关闭它时才会被删除,因此不会留下对 inode 的引用(在目录结构和 运行 进程中)。
我很难理解 Python 在 open
编辑后删除文件时如何读取文件的概念。这是代码:
>>> 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
与 Python 无关。在 C、Fortran 或 Visual Cobol 中,只要代码从 open
系统调用中获取句柄,您就会有相同的行为。
在 Linux/Unix 系统上,一旦进程拥有文件句柄,它就可以读取它,即使文件已被删除。有关更多详细信息,请查看 that question(我不确定是否可以这样做,似乎是)
在 Windows 上,只要文件被进程锁定,您就无法删除它。
在Linux,目录结构和文件本身是分开的。该文件由 inode 标识。所以当你按名称打开文件时,你读取目录结构,找到一个对应名称的inode,然后按inode打开文件。删除文件或重命名文件会改变目录结构,但不会影响 inode。文件本身只有在您关闭它时才会被删除,因此不会留下对 inode 的引用(在目录结构和 运行 进程中)。