web-dev-qa-db-ja.com

エンコードを知らずにPython 3でファイルにバイトを書き込む方法は?

In Python 2.x with 'file-like' object:

sys.stdout.write(bytes_)
tempfile.TemporaryFile().write(bytes_)
open('filename', 'wb').write(bytes_)
StringIO().write(bytes_)

同じことをPython 3?

これと同等の記述方法Python 2.xコード:

def write(file_, bytes_):
    file_.write(bytes_)

注意: sys.stdoutは、必ずしも意味的にテキストストリームではありません。場合によってはバイトストリームと見なすことが有益な場合があります。たとえば、 リモートマシンでdir /の暗号化されたアーカイブを作成

tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg'

この場合、Unicodeを使用しても意味がありません。

44
jfs

それは、文字列ではなくバイトで動作するAPIを使用することの問題です。

sys.stdout.buffer.write(bytes_)

docs で説明されているように、detachストリームを使用することもできるため、デフォルトではバイナリになります。

これは、基礎となるバイトバッファーにアクセスします。

tempfile.TemporaryFile().write(bytes_)

これはすでにバイトAPIです。

open('filename', 'wb').write(bytes_)

「b」から予想されるように、これはバイトAPIです。

from io import BytesIO
BytesIO().write(bytes_)

BytesIOは、StringIOと同等のバイトです。

編集:writeは、任意のbinaryファイルのようなオブジェクトで動作します。したがって、一般的な解決策は、適切なAPIを見つけることです。

54

ファイルを開くときに、バイナリモード「b」を指定します。

with open('myfile.txt', 'wb') as w:
    w.write(bytes)

https://docs.python.org/3.3/library/functions.html#open

19
bigonazzi