2016-10-20 3 views
6

openの後にファイルを削除したときにPythonがファイルを読み込む方法の概念を理解するのが難しいです。コードは次のとおりです。開かれた後にファイルが削除されたときにPythonがファイルを読み取る方法

>>> 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で行うには

  • python 3.4.3/3.5.2
  • ubuntu 14.04/16.04

答えて

6

ナッシングでこのテストを実行しました。 C、Fortran、またはVisual Cobolでは、コードがopenシステムコールからハンドルを取得するのと同じ動作をします。

Linux/Unixシステムでは、プロセスがファイルにハンドルを設定すると、ファイルが削除されてもそれを読み取ることができます。詳細については、that questionを確認してください(これは問題ないかどうかはわかりませんでした)

Windowsでは、プロセスによってロックされている限り、ファイルを削除することはできません。

3

Linuxでは、ディレクトリ構造とファイル自体が分離されています。このファイルはinodeによって識別されます。したがって、名前でファイルを開くと、ディレクトリ構造を読み、その名前に対応するinodeを見つけて、inodeでファイルを開きます。ファイルを削除するか名前を変更すると、ディレクトリ構造は変更されますが、inodeには影響しません。ファイル自体は、それを閉じるときにのみ削除されるので、inodeへの参照は残されません(ディレクトリ構造と実行中のプロセスの両方)。

関連する問題