2010-11-27 16 views
29

En Python 2.x avec 'fichier comme' objet:Comment écrire des octets dans un fichier en Python 3 sans connaître le codage?

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

Comment faire la même chose en Python 3?

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

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

Note: sys.stdout est pas toujours sémantiquement un flux de texte. Il pourrait être utile de le considérer comme un flux d'octets parfois. Par exemple, make encrypted archive of dir/ on remote machine:

tar -c dir/ | gzip | gpg -c | ssh [email protected] 'dd of=dir.tar.gz.gpg' 

Il n'y a pas de point d'utiliser Unicode dans ce cas.

Répondre

36

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 le docs expliquer, vous pouvez aussi detach les cours d'eau, ils sont donc binaire par défaut.

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

tempfile.TemporaryFile().write(bytes_) 

Ceci est déjà une API d'octets. Comme vous pouvez l'attendre de 'b', il s'agit d'une API byte.

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

BytesIO est l'octet de poids équivalent à StringIO.

EDIT: write fonctionnera simplement sur n'importe quel binaire comme un objet de type fichier. Donc, la solution générale est juste de trouver la bonne API.

+0

Est-il possible d'écrire fonction générale sans avoir recours à une vérification du type tel que 'isinstance (fichier_, io .TextIOWrapper) ', etc. – jfs

+0

@JF, Python 3 est conçu spécifiquement pour gérer le texte v. Binaire diviser correctement. Sans connaître l'encodage, il n'y a pas de chemin correct entre binaire et texte. Il n'y a donc aucun moyen d'écrire une fonction générale qui écrit des octets dans un flux de texte. Plongez dans Python 3 a un bon [article] (http://diveintopython3.org/strings.html) sur ce sujet. –

+0

La question concerne spécifiquement * octets *. Par exemple, 'os.write (sys.stdout.fileno(), bytes_)'. – jfs