【问题标题】:How Python reads a file when it was deleted after being opened文件打开后被删除时Python如何读取文件
【发布时间】:2017-03-02 02:39:40
【问题描述】:

我很难理解 Python 在文件被 open'ed 删除后如何读取文件的概念。代码如下:

>>> 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 linux file readfile


    【解决方案1】:

    与 Python 无关。在 C、Fortran 或 Visual Cobol 中,只要代码从 open 系统调用中获取句柄,您就会有相同的行为。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 2015-05-05
        • 2020-03-29
        • 1970-01-01
        • 2023-02-08
        相关资源
        最近更新 更多