Mikhail Geyer Mikhail Geyer - 1 month ago 11
Linux Question

How Python reads a file when it was deleted after being opened

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


Answer

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.

Comments