Pythonでファイルハンドラーのflushメソッドを呼び出す必要がありますか

一瞬で

file.flush()を使用しているコードを見ました。だから、私は周りを検索して、このSO投稿を見つけましたなぜフラッシュ方式があるのか​​理解できました。回答としてマークされた回答には、次のように書かれています。

通常、どちらの方法も気にする必要はありませんが、実際にディスクに何が表示されるかについての妄想が良いシナリオの場合は、指示に従って両方の呼び出しを行う必要があります。

だから、コンテキストマネージャーを使用してファイルを開いてテキストを書き込んだ後、コードがこのコンテキストマネージャーを終了すると、テキストがファイルに書き込まれていない可能性があるのではないかと思っていました。はいの場合、file.close()が呼び出されたときにPythonがこれを内部的に実行しないのはなぜですか?すでに行われていますか?

abarnert

ファイルには、内のオブジェクトioモジュール(あなたから得るものopen)と、他のどこでも、いつでもSTDLIBに期待するflush彼らときclose、またはがそうすることが保証されているプラットフォームAPIに依存しています。

サードパーティのライブラリでさえclose、オブジェクトをファイルオブジェクトにする場合はメソッドで「ストリームを閉じてフラッシュする」必要があります。1


呼び出す主な理由flush、ファイルをまだ閉じてないが、他のプログラムが内容を確認したい場合です。


たとえば、多くの人が次のようなコードを記述します。

with open('dump.txt', 'w') as f:
    while True:
        buf = read_off_some_thingy()
        f.write(buf.decode())
        time.sleep(5)

…そして、なぜcat dump.txtメモ帳などで開いたときに、空であるか、最後の3行が欠落しているか、行の途中で途切れているのか疑問に思います。それが問題のflush解決です:

with open('dump.txt', 'w') as f:
    while True:
        buf = read_off_some_thingy()
        f.write(buf.decode())
        f.flush()
        time.sleep(5)

または、代わりに、同じコードを実行していますが、問題は、誰かがコンピューターのプラグを抜く可能性があり(または、最近では、コンテナーを強制終了する可能性があります)、再起動後に破損したファイルが作成されて切断されることです。正中線でオフになり、出力をスキャンするperlスクリプトが実行されず、perlコードをデバッグする必要がなくなります。別の問題、同じ解決策。


ただし、ファイルがいずれかの時点で閉じられることを知っていて(たとえば、withその前に終了するステートメントがあるため)、その時点より前にファイルを実行する必要がない場合は、必要ありません。を呼び出す必要がありますflush


あなたは言及しませんでしたがfsync、これはまったく別の問題であり、ほとんどの人よりもはるかに複雑なので、私はそれには入りません。しかし、あなたがリンクした質問はすでに基本をカバーしています。


1.必要に応じてファイルオブジェクトに十分に近いダックタイプのファイルのようなオブジェクトでサードパーティのライブラリを使用している可能性は常にありますが、そうではありません。そして、そのようなタイプはそうcloseではないかもしれませんflushしかし、正直なところ、flushメソッドを持っていて、それをクローズで呼び出さなかったオブジェクトを見たことがないと思います

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

すべてのノードのJSファイルでdotenvを呼び出す必要がありますか?

分類Dev

Futureメソッドパラメータを「名前で」呼び出す必要がありますか?

分類Dev

C#dllimportネイティブメソッド呼び出しでパラメーターのメモリを解放する必要がありますか?

分類Dev

PagedListエラー:メソッド「Skip」の前にメソッド「OrderBy」を呼び出す必要があります

分類Dev

コマンドラインからファイルを呼び出す必要があります

分類Dev

この状況では、flush()(JPAインターフェース)を呼び出す必要がありますか?

分類Dev

C#非同期ライブラリメソッドの呼び出しを待つ必要がありますか?

分類Dev

create()を呼び出すときの `TypeError`。フィールドを読み取り専用にするか、create()メソッドをオーバーライドする必要がある場合があります

分類Dev

Cでの呼び出しごとにシグナルハンドラーをリセットする必要がありますか?

分類Dev

ドライバでメソッドを呼び出す前に、アルゴリズムをどこに設定する必要がありますか?

分類Dev

基本クラスを呼び出す前に、メンバーのメソッドを呼び出す必要があります

分類Dev

Android NavigationInstrumentationのテストスローメソッドaddObserverをメインスレッドで呼び出す必要があります

分類Dev

コードビハインドでNotifyPropertyChange()を呼び出す必要がありますか?

分類Dev

異なる解像度でフレームバッファーをバインドするたびにglViewportを呼び出す必要がありますか?

分類Dev

子クラスのsuper()で親クラスのメソッドを呼び出す必要があります

分類Dev

DefaultTreeModelでnodesWereInserted()および同様のメソッドを呼び出す必要がありますか?

分類Dev

私のメソッド(secメソッド)を実行してメインクラスに呼び出す必要があります

分類Dev

「this」を使用してクラスのプロパティ、メンバー、またはメソッドを呼び出す必要がありますか?

分類Dev

serveHTTPハンドラでインターフェースメソッドと構造体メソッドを呼び出す際の違いは何ですか?

分類Dev

クロージャ内で常に完了ハンドラーを呼び出す必要がありますか?

分類Dev

データを使用するメソッドはどこで呼び出す必要がありますか?

分類Dev

Google App Engine-ハンドラーでself.responseを呼び出す必要がありますか?

分類Dev

メソッドはNetbeansでsuper()エラーを呼び出す必要があります

分類Dev

Pythonでは、親クラスから子クラスのメソッドオーバーライドを呼び出す方法はありますか?

分類Dev

Javaのinvokevirtualが呼び出されたメソッドのコンパイル時クラスを解決する必要があるのはなぜですか?

分類Dev

SpringでRuntimeExceptionをスローするプライベートメソッドを呼び出す場合、@ Transactionalメソッドをロールバックする必要がありますか?

分類Dev

Swiftプロトコルと拡張機能、要件に応じてオーバーライドされたメソッドまたはデフォルトの拡張メソッドを呼び出す必要があります

分類Dev

呼び出しAPIチェーンのすべてのメソッドでasync / awaitを使用する必要がありますか?

分類Dev

Pythonでは、super()は常にメソッドの最初に呼び出されます。後で呼び出す必要がある状況はありますか?

Related 関連記事

  1. 1

    すべてのノードのJSファイルでdotenvを呼び出す必要がありますか?

  2. 2

    Futureメソッドパラメータを「名前で」呼び出す必要がありますか?

  3. 3

    C#dllimportネイティブメソッド呼び出しでパラメーターのメモリを解放する必要がありますか?

  4. 4

    PagedListエラー:メソッド「Skip」の前にメソッド「OrderBy」を呼び出す必要があります

  5. 5

    コマンドラインからファイルを呼び出す必要があります

  6. 6

    この状況では、flush()(JPAインターフェース)を呼び出す必要がありますか?

  7. 7

    C#非同期ライブラリメソッドの呼び出しを待つ必要がありますか?

  8. 8

    create()を呼び出すときの `TypeError`。フィールドを読み取り専用にするか、create()メソッドをオーバーライドする必要がある場合があります

  9. 9

    Cでの呼び出しごとにシグナルハンドラーをリセットする必要がありますか?

  10. 10

    ドライバでメソッドを呼び出す前に、アルゴリズムをどこに設定する必要がありますか?

  11. 11

    基本クラスを呼び出す前に、メンバーのメソッドを呼び出す必要があります

  12. 12

    Android NavigationInstrumentationのテストスローメソッドaddObserverをメインスレッドで呼び出す必要があります

  13. 13

    コードビハインドでNotifyPropertyChange()を呼び出す必要がありますか?

  14. 14

    異なる解像度でフレームバッファーをバインドするたびにglViewportを呼び出す必要がありますか?

  15. 15

    子クラスのsuper()で親クラスのメソッドを呼び出す必要があります

  16. 16

    DefaultTreeModelでnodesWereInserted()および同様のメソッドを呼び出す必要がありますか?

  17. 17

    私のメソッド(secメソッド)を実行してメインクラスに呼び出す必要があります

  18. 18

    「this」を使用してクラスのプロパティ、メンバー、またはメソッドを呼び出す必要がありますか?

  19. 19

    serveHTTPハンドラでインターフェースメソッドと構造体メソッドを呼び出す際の違いは何ですか?

  20. 20

    クロージャ内で常に完了ハンドラーを呼び出す必要がありますか?

  21. 21

    データを使用するメソッドはどこで呼び出す必要がありますか?

  22. 22

    Google App Engine-ハンドラーでself.responseを呼び出す必要がありますか?

  23. 23

    メソッドはNetbeansでsuper()エラーを呼び出す必要があります

  24. 24

    Pythonでは、親クラスから子クラスのメソッドオーバーライドを呼び出す方法はありますか?

  25. 25

    Javaのinvokevirtualが呼び出されたメソッドのコンパイル時クラスを解決する必要があるのはなぜですか?

  26. 26

    SpringでRuntimeExceptionをスローするプライベートメソッドを呼び出す場合、@ Transactionalメソッドをロールバックする必要がありますか?

  27. 27

    Swiftプロトコルと拡張機能、要件に応じてオーバーライドされたメソッドまたはデフォルトの拡張メソッドを呼び出す必要があります

  28. 28

    呼び出しAPIチェーンのすべてのメソッドでasync / awaitを使用する必要がありますか?

  29. 29

    Pythonでは、super()は常にメソッドの最初に呼び出されます。後で呼び出す必要がある状況はありますか?

ホットタグ

アーカイブ