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

时间:2016-10-20 07:57:02

标签: python linux file readfile

我很难理解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

2 个答案:

答案 0 :(得分:6)

与Python无关。在C,Fortran或Visual Cobol中,只要代码从open系统调用获得其处理,就会有相同的行为。

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

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

答案 1 :(得分:3)

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