2010-11-27 9 views
29

In Python 2.x mit 'Datei-like' Objekt:Wie schreibt man Bytes in eine Datei in Python 3, ohne die Codierung zu kennen?

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

Wie 3 das gleiche in Python zu tun?

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

Hinweis: sys.stdout ist nicht immer semantisch ein Textstrom

Wie 2.x Code Äquivalent dieser Python zu schreiben. Es könnte nützlich sein, es manchmal als einen Bytestrom zu betrachten. Zum Beispiel make encrypted archive of dir/ on remote machine:

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

Es gibt keinen Grund zur Verwendung von Unicode in diesem Fall.

Antwort

36

Es ist eine Frage der Verwendung von APIs, die auf Bytes statt Strings arbeiten.

sys.stdout.buffer.write(bytes_) 

Als docs erklären, können Sie auch detach die Ströme, also sind sie standardmäßig binär.

Dies greift auf den zugrunde liegenden Byte-Puffer zu.

tempfile.TemporaryFile().write(bytes_) 

Dies ist bereits eine Byte-API.

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

Wie Sie von der 'b' erwarten, ist dies eine Byte-API.

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

BytesIO ist das Byte entspricht StringIO.

EDIT: write wird nur auf einem beliebigen binäre Datei-Objekt arbeiten. Die allgemeine Lösung besteht also nur darin, die richtige API zu finden.

+0

Gibt es eine Möglichkeit allgemeine Funktion zu schreiben, ohne eine solche zu geben greifen Überprüfung als 'isinstance (file_, io .TextIOWrapper) ', etc. – jfs

+0

@JF, Python 3 wurde speziell entwickelt, um den Text v. Binary divide richtig zu behandeln. Ohne die Codierung zu kennen, gibt es keinen richtigen Weg, um zwischen Binär und Text zu wechseln. Es gibt also keine Möglichkeit, eine allgemeine Funktion zu schreiben, die Bytes in einen Text-Stream schreibt. Dive Into Python 3 hat dazu einen guten Artikel (http://diveintopython3.org/strings.html). –

+0

Die Frage bezieht sich speziell auf * Bytes *. Zum Beispiel "os.write (sys.stdout.fileno(), bytes_)". – jfs

Verwandte Themen