4

ドキュメントを読んでPythonを独学しようとしています。ファイル バッファをフラッシュすることの意味を理解しようとしています。ドキュメントによると、「file.flush」は次のことを行います。

Flush the internal buffer, like stdio‘s fflush().
This may be a no-op on some file-like objects.

「内部バッファー」と「ノーオペレーション」が何を意味するのかわかりませんがflush、何らかのバッファーからファイルにデータを書き込むと言っていると思います。

したがって、このファイルを実行して、中央の行のシャープ記号を切り替えました。

with open("myFile.txt", "w+") as file:
    file.write("foo")
    file.write("bar")
    # file.flush()
    file.write("baz")
    file.write("quux")

ただし、 へmyFile.txtの呼び出しの有無にかかわらず、同じ結果になるようですfile.flush()。どんな効果がfile.flush()あるの?

4

2 に答える 2

11

Python バッファはファイルに書き込みます。つまりfile.write、データが実際にハード ドライブに書き込まれる前に戻ります。これの主な動機は、いくつかの大きな書き込みが多くの小さな書き込みよりもはるかに高速であるため、出力がfile.write少し蓄積されるまで保存することで、Python は良好な書き込み速度を維持できることです。

file.flushその時点でデータが強制的に書き出されます。これは、書き出すデータが増えるまでにしばらく時間がかかることがわかっているが、他のプロセスが既に書き込んだデータを表示できるようにしたい場合に便利です。ゆっくりと大きくなるログ ファイルを想像してみてください。データが 1 つの大きなチャンクに書き出されるのに十分な数のエントリが蓄積されるまで、何年も待つ必要はありません。

どちらの場合でもfile.close、残りのデータがフラッシュされるため、コード内の「quux」はすぐに書き出されます(組み込みコンストラクターfileをシャドウするため、これは非常に悪い名前です)コンテキスト マネージャーの範囲外になり、取得されます。閉まっている。filewith

注:あなたのOSは独自のバッファリングを行いますが、Pythonが実装されているすべてのOSは、file.flushデータをドライブに書き出すという要求を尊重すると思います。私が間違っている場合は、誰かが私を修正してください。

ちなみに、「ノーオペレーション」とは「ノーオペレーション」という意味で、実際には何もしません。たとえば、StringIO オブジェクトは、ハード ドライブ上のファイルではなく、メモリ内の文字列を操作します。StringIO.flush実際には何もすることがないので、おそらくすぐに戻ります。

于 2012-05-11T03:57:02.473 に答える
3

パフォーマンスを向上させるために、バッファーの内容がキャッシュされる場合があります。フラッシュは、コンテンツがディスクに完全に書き込まれるようにし、データの損失を防ぎます。たとえば、次のファイル操作が行われる前に、ユーザー入力を求める行を完全に画面に表示したい場合にも役立ちます。

于 2012-05-11T03:52:20.753 に答える