Как записать байты в файл в Python 3, не зная кодировку? - PullRequest
43 голосов
/ 27 ноября 2010

В Python 2.x с «файловым» объектом:

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 в этом случае.

Ответы [ 2 ]

53 голосов
/ 27 ноября 2010

Это вопрос использования API, которые работают с байтами, а не со строками.

sys.stdout.buffer.write(bytes_)

Как объясняют документы , вы также можете detach потоки, чтобы они 'по умолчанию является двоичным.

Доступ к базовому байтовому буферу.

tempfile.TemporaryFile().write(bytes_)

Это уже байтовый API.

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

Как и следовало ожидать от 'b ', это байтовый API.

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

BytesIO - это байтовый эквивалент StringIO.

EDIT: write будет просто работать на любом бинарном файле файлоподобный объект.Таким образом, общее решение - просто найти правильный API.

19 голосов
/ 09 февраля 2016

Укажите двоичный режим, 'b', когда вы открываете свой файл:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...