2016-06-28 9 views
3

複数の「ページ」を含むテキストファイルを作成し、各ページのバイトオフセットを別々のファイルに記録したかったのです。これを行うために、私は文字列をメイン出力ファイルに出力し、bytes_written += file.write(str)を使用してバイト数をカウントしました。しかし、バイトオフセットはしばしば間違っていました。Python 3:writeメソッドとos.writeの比較返されるバイト数

bytes_written += os.write(fd, bytes(str, 'UTF-8'))に切り替えました。 write()os.write()の違いは何ですか?または、文字列をUTF-8に手動で変換しただけで、戻り値の違いがありますか?

+0

Windows上でファイルがテキストモードで書き込まれている場合、元の文字列に1文字しか含まれていないすべての行で2バイト(cr + lf)が書き込まれます。この場合、 'file.write()'がバイト数を適切に数えていない場合、私はバグだと考えていますが、ファイルが '" wb "'モードで開かれているかどうかを確認することによって問題を解決できます。 – kindall

+0

* text *ファイルに関する他の同様の点: 'tell 'によって返される値はファイル内のバイトインデックスでも文字インデックスでもない**です。それはちょうど「シーク」がその位置に戻るのに使うことができる数字ですが、あなたはそれについて多くを行うべきではありません。 – Bakuriu

答えて

3

write()os.write()の違いは何ですか?

これは、C関数fwrite(3)write(2)の違いと似ています。

後者はOSレベルのsystem callの薄いラッパーですが、前者は標準的なCライブラリの一部であり、いくつかの追加のバッファリングを行い、最終的にバッファリングされたデータをfile descriptor

Python 3.xは、fileオブジェクトのwrite()メソッドに、Python strオブジェクトの自動文字エンコード変換を実行するメソッドを追加します。ただし、Python 2.xは追加しません。

また、文字列をUTF-8に手動で変換しただけで、戻り値の違いがありますか?

Python 3.xでは、ファイルを開いた方法との違いが大きくなりました。

ファイルをバイナリモードで開いた場合(例: f = open(filename, 'wb')の場合f.write()にはbytesオブジェクトがあり、バイトのが返されます。

代わりに、テキストモードでファイルを開いたとします。 f = open(filename, 'w')f.write()strオブジェクトを想定しており、文字のが返されます。これは、UTF-8などのマルチバイトエンコーディングでは、書き込まれたバイト数と一致しない可能性があります。 os.open()を呼び出すときos.write()方法は常にかどうかにかかわらずO_BINARYフラグ、bytesオブジェクトを期待

注使用しました。

関連する問題