Как написать байты в файл в 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.
Ответы
Ответ 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.
Ответ 2
Определите двоичный режим, 'b', когда вы открываете файл:
with open('myfile.txt', 'wb') as w:
w.write(bytes)
https://docs.python.org/3.3/library/functions.html#open