テストを実行していますが、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)
ディスクへの書き込みは遅いため、多くのプログラムは書き込みを大きなチャンクに保存し、一度に書き込みます。これはバッファリングと呼ばれ、ファイルを開くとPythonが自動的に実行します。
ファイルに書き込むときは、実際にはメモリ内の「バッファ」に書き込んでいます。いっぱいになると、Pythonは自動的にディスクに書き込みます。「バッファ内のすべてを今すぐディスクに書き込む」と言うことができます。
_f.flush()
_
オペレーティングシステムはおそらく書き込みもバッファリングするため、これは完全な話ではありません。 itにファイルのバッファを書き込むように指示できます。
_os.fsync(f.fileno())
_
最後に、Python特定のファイルをopen(f, "w", 0)
でバッファリングしないように、またはopen(f,"w", 1)
で1行のバッファを保持するように指示できます。当然、これは書き込みが遅いため、そのファイルに対するすべての操作が遅くなります。
ファイル書き込みバッファをファイルにフラッシュするには、f.close()
する必要があります。または、あなたの場合は、f.flush(); os.fsync();
を実行して、開いているファイルハンドルでループを続けることができます。
import os
することを忘れないでください。
あなたはチェックアウトしたいと思うでしょう file.flush()
-これはnotにデータを書き込むかもしれないことに注意してくださいディスク、引用する:
注:flush()は、必ずしもファイルのデータをディスクに書き込むとは限りません。この動作を確実にするには、flush()に続いてos.fsync()を使用します。
ファイルを閉じる( file.close()
)は、データが書き込まれることも保証します-with
を使用すると、これが暗黙的に実行されます。明快さ-他の潜在的な問題を解決することは言うまでもありません。
強制的に書き込む必要があるため、次の行を使用してファイルが確実に書き込まれるようにします。
# Two commands together force the OS to store the file buffer to disc
f.flush()
os.fsync(f.fileno())
これはウィンドウズイズムです。ファイルの処理が完了したときに明示的な.close()
を追加すると、その時点でエクスプローラーに表示されます。フラッシュするだけでも十分かもしれません(テストに便利なWindowsボックスがありません)。しかし、基本的にf.write 実際には書き込みません、書き込みバッファーに追加するだけです-バッファーがフラッシュされるまで、表示されません。
UNIXでは、この状況では通常、ファイルは0バイトのファイルとして表示されます。
フラッシュされるファイルハンドラー。
f.flush()