2017-07-06 7 views
2

私は、これは実際に私まで、ファイルにデータを入れていないことに気づいた私は、コードjson.dumps(dictionary,outfile)ファイルはいつ更新されますか?

を使用このコードで制御C.に端子を介してキャンセルし、無限ループで実行されるコードのセットを持っていますコントロールCを使用してプロセスを終了しました。プログラムが終了するまで、ファイルが更新されないのはなぜですか?

+2

私はあなたに正確な答えを与えるためにもう少しコードが必要だと思います。 多くの変更は、大量のI/O時間を節約するために、ディスクに一括して書き込まれる前にキャッシュされていることがわかります。 'outfile.flush()'を呼び出すことで強制的に強制することができます。通常 –

答えて

1

アンソニー・ロッシは基本的には正しいです。outfile.flush()を使用してデータをフラッシュする必要があります。しかし、なぜそういうのですか?

json.dumpは、 "a.write() - サポートファイルライクなオブジェクト"(hereを参照)が必要です。あなたのコードのどこかで、openを使ってoutfileを取得しました。 openのドキュメントを見ると、次のようになります。

バッファリングは、バッファリングポリシーを設定するためのオプションの整数です。 (バイナリモードでのみ許可されます)、ラインバッファリング(テキストモードでのみ使用可能)を選択するには0、固定サイズのチャンクバッファのサイズを示すには整数> 1を渡します。バッファリングの引数が指定されない場合は、次のように、デフォルトのバッファリングポリシーは動作します:

  • バイナリファイルは固定サイズのチャンクにバッファリングされています。バッファのサイズは、基礎となるデバイスの「ブロックサイズ」を決定し、io.DEFAULT_BUFFER_SIZEに戻すヒューリスティックを使用して選択されます。多くのシステムでは、バッファーは通常4096または8192バイトの長さになります。

  • "インタラクティブ"テキストファイル(isatty()がTrueを返すファイル)は、行バッファリングを使用します。他のテキストファイルは、バイナリファイルに対して上記のポリシーを使用します。

私はあなたがbufferingパラメータを指定していないと、あなたのデータは4月8日KB未満であると思います。したがって、書き込みはバッファされ、ファイルに直接書き込まれません。

Ctrl+Cを使用してプログラムを終了すると、outfileが閉じられ、ファイルにデータがフラッシュされます。

これを修正するには、json.dump()の後にoutfile.flush()と入力してください。アンソニー・ロッシが提案したとおりです。

+0

ありがとうございました。私はバッファリングパラメータを指定していないので、プログラムを終了するとデータがフラッシュされました。 –

関連する問題