How to write bytes to a file in Python 3 without knowing the encoding?

io, python, python-3.x

Solution

It's a matter of using APIs that operate on bytes, rather than strings.

sys.stdout.buffer.write(bytes_)

As the docs explain, you can also `detach` the streams, so they're binary by default.

This accesses the underlying byte buffer.

tempfile.TemporaryFile().write(bytes_)

This is already a byte API.

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

As you would expect from the 'b', this is a byte API.

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

`BytesIO` is the byte equivalent to `StringIO`.

EDIT: `write` will Just Work on any binary file-like object. So the general solution is just to find the right API.

Problem

In Python 2.x with 'file-like' object: ``` sys.stdout.write(bytes_) tempfile.TemporaryFile().write(bytes_) open('filename', 'wb').write(bytes_) StringIO().write(bytes_) ``` How to do the same in Python 3? How to write equivalent of this Python 2.x code: ``` def write(file_, bytes_): file_.write(bytes_) ``` Note: `sys.stdout` is not always semantically a text stream. It might be beneficial to consider it as a stream of bytes sometimes. For example, make encrypted archive of dir/ on remote machine: ``` tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg' ``` There is no point to use Unicode in this case.

Original source