web-dev-qa-db-fra.com

Comment écrire des octets dans un fichier en Python 3 sans connaître l'encodage?

Dans Python 2.x avec un objet "semblable à un fichier":

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

Comment faire de même dans Python 3?

Comment écrire l'équivalent de ce code Python 2.x:

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

Remarque: sys.stdout n'est pas toujours sémantiquement un flux de texte. Il peut être avantageux de le considérer parfois comme un flux d'octets. Par exemple, créer une archive chiffrée de dir/sur la machine distante :

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

Il est inutile d'utiliser Unicode dans ce cas.

44
jfs

Il s'agit d'utiliser des API qui fonctionnent sur des octets plutôt que sur des chaînes.

sys.stdout.buffer.write(bytes_)

Comme l'explique docs , vous pouvez également detach les flux, ils sont donc binaires par défaut.

Cela accède au tampon d'octets sous-jacent.

tempfile.TemporaryFile().write(bytes_)

Il s'agit déjà d'une API d'octets.

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

Comme vous pouvez vous y attendre du "b", il s'agit d'une API d'octets.

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

BytesIO est l'équivalent en octets de StringIO.

EDIT: write fonctionnera simplement sur n'importe quel objet de type fichier binaire . La solution générale consiste donc simplement à trouver la bonne API.

54
Matthew Flaschen

Spécifiez le mode binaire, "b", lorsque vous ouvrez votre fichier:

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

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

19
bigonazzi