2017-02-02 5 views
1

はあなたが標準出力にバイナリデータを記述する必要があるとしましょう:Python:sys.stdout.flush()とsys.stdout.buffer.flush()?

sys.stdout.buffer.write(data) 

そして、それをフラッシュするためには、これらの2のいずれかを使用することができます。

sys.stdout.flush() 
sys.stdout.buffer.flush() 

これらの二つの呼び出しの両方が同じように動作するように見えます簡単な状況でしかしながら

  • 最初のものは、第二つだけbufferサブオブジェクト(_io.BufferedWriter)上でフラッシュ呼び出す全体stdoutオブジェクト(_io.TextIOWrapper

  • にフラッシュ呼び出します。

いずれか一方が他方よりも優先される状況は何ですか?

答えて

1

TextIOWrapperBufferedWriterの違いは、それらが処理するように設計されていることです。生のバイトストリーム(RawIOBase)上のバッファリングと

BufferedIOBase情報:Pythonドキュメントを見て、あなたがBufferedWriterはバイトストリームを処理するように設計されていることがわかりますを持ちます。そのサブクラスであるBufferedWriter,BufferedReader、およびBufferedRWPairは、読み込み、書き込み、および読み書きが可能なバッファストリームです。

は、テキストに固有のバイトストリームを処理するように設計されていますが、エンコードやデコードのような処理を行います。

IOBaseサブクラス、TextIOBaseは、そのバイトのテキストを表すストリームを扱う、そしてunicodeストリングからとに符号化および復号化を取り扱います。それを拡張するTextIOWrapperは、バッファされた生ストリーム(BufferedIOBase)に対するバッファ付きテキストインターフェイスです。

あなたはどちらをフラッシュする必要がありますか? TextIOWrapperは、実際にはテキストのラッパーであるBufferedIOBaseの洗濯物です。したがって、あなたが言うように、実際にバイナリデータを扱い、テキストベースのデータではない場合は、BufferedIOBaseを使用することができます。

+0

より完全な答えを得るために 'sys.stdout.buffer'の代わりに' BufferedIOBase'を使用する方法の例を挙げることができますか? (私は新しいオブジェクトを作成しなければならないか、議論は何かなど) – user7501761

+0

あなたが合理的に尋ねた質問に私は答えたと思います。 'BufferedIOBase'クラスの使い方を知りたければ、[これらのようなリソース](http://www.programcreek.com/python/example/26237/io.BufferedIOBase)をいつでも見ることができます。 – loganasherjones

関連する問題