web-dev-qa-db-ja.com

プログラムを停止するまでファイルが書き込まれないのはなぜですか?

テストを実行していますが、Cを制御してプログラムを中止するまで、ファイルが実際に書き込まれないことがわかりました。なぜそれが起こるのか誰かが説明できますか?

同時に書き込むことを期待していたので、プロセスの途中でファイルを読み取ることができました。

import os
from time import sleep

f = open("log.txt", "a+")
i = 0
while True:
  f.write(str(i))
  f.write("\n")
  i += 1
  sleep(0.1)
29
Marvin K

ディスクへの書き込みは遅いため、多くのプログラムは書き込みを大きなチャンクに保存し、一度に書き込みます。これはバッファリングと呼ばれ、ファイルを開くとPythonが自動的に実行します。

ファイルに書き込むときは、実際にはメモリ内の「バッファ」に書き込んでいます。いっぱいになると、Pythonは自動的にディスクに書き込みます。「バッファ内のすべてを今すぐディスクに書き込む」と言うことができます。

_f.flush()
_

オペレーティングシステムはおそらく書き込みもバッファリングするため、これは完全な話ではありません。 itにファイルのバッファを書き込むように指示できます。

_os.fsync(f.fileno())
_

最後に、Python特定のファイルをopen(f, "w", 0)でバッファリングしないように、またはopen(f,"w", 1)で1行のバッファを保持するように指示できます。当然、これは書き込みが遅いため、そのファイルに対するすべての操作が遅くなります。

67
Katriel

ファイル書き込みバッファをファイルにフラッシュするには、f.close()する必要があります。または、あなたの場合は、f.flush(); os.fsync();を実行して、開いているファイルハンドルでループを続けることができます。

import osすることを忘れないでください。

5
deed02392

あなたはチェックアウトしたいと思うでしょう file.flush() -これはnotにデータを書き込むかもしれないことに注意してくださいディスク、引用する:

注:flush()は、必ずしもファイルのデータをディスクに書き込むとは限りません。この動作を確実にするには、flush()に続いてos.fsync()を使用します。

ファイルを閉じる( file.close() )は、データが書き込まれることも保証します-withを使用すると、これが暗黙的に実行されます。明快さ-他の潜在的な問題を解決することは言うまでもありません。

1
Gareth Latty

強制的に書き込む必要があるため、次の行を使用してファイルが確実に書き込まれるようにします。

# Two commands together force the OS to store the file buffer to disc
    f.flush()
    os.fsync(f.fileno())
1
Gil.I

これはウィンドウズイズムです。ファイルの処理が完了したときに明示的な.close()を追加すると、その時点でエクスプローラーに表示されます。フラッシュするだけでも十分かもしれません(テストに便利なWindowsボックスがありません)。しかし、基本的にf.write 実際には書き込みません、書き込みバッファーに追加するだけです-バッファーがフラッシュされるまで、表示されません。

UNIXでは、この状況では通常、ファイルは0バイトのファイルとして表示されます。

0
Tyler Eaves

フラッシュされるファイルハンドラー。

f.flush()

ガベージコレクションが有効になるまで出力バッファがフラッシュされず、I/Oバッファがフラッシュされるため(おそらくf.close()を呼び出すことによって)、ファイルは書き込まれません。

または、ループ内で、文書化されているように、f.flush()の後にos.fsync()を呼び出すことができます ここ

f.flush()
os.fsync()

そうは言っても、そのファイルのデータをコードの他の部分と共有する予定がある場合は、 StringIO オブジェクトを使用することを強くお勧めします。

0
nesv