Подтвердить что ты не робот

Как написать байты в файл в Python 3 без знания кодировки?

В 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 [email protected] 'dd of=dir.tar.gz.gpg'

В этом случае нет смысла использовать Unicode.

4b9b3361

Ответ 1

Это вопрос использования 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.

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