9

I'm having difficulties in understanding the concept of how Python reads a file when it was deleted after being open'ed. Here is the code:

>>> 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'
>>>

Text and binary modes give the same result.

I tried this also for big files with more than 1Gb size and they were also read after being deleted. The operation of open happens almost instantaneously even for very big files.

From where does Python get the data if an open file does not exist anymore?

I ran this test on

  • python 3.4.3 / 3.5.2
  • ubuntu 14.04 / 16.04
Mikhail Geyer
  • 881
  • 2
  • 9
  • 27

2 Answers2

8

Nothing to do with Python. In C, Fortran, or Visual Cobol you'd have the same behaviour as long as the code gets its handle from open system call.

On Linux/Unix systems, once a process has a handle on a file, it can read it, even if the file is deleted. For more details check that question (I wasn't sure if it was OK to do that, it seems to be)

On Windows you just wouldn't be able to delete the file as long as it's locked by a process.

Community
  • 1
  • 1
Jean-François Fabre
  • 137,073
  • 23
  • 153
  • 219
4

On Linux, directory structure and the files themselves are separated. The file is identified by an inode. So when you open a file by name, you read the directory structure, find an inode that corresponds to the name and then open the file by the inode. Deleting the file or renaming it will change the directory structure but will not affect the inode. The file itself will be deleted only when you close it, so no references to the inode will be left (both in directory structure and from running processes).

Nisse Engström
  • 4,738
  • 23
  • 27
  • 42
Alexey Guseynov
  • 5,116
  • 1
  • 19
  • 29