2010-11-27 16 views
29

En Python 2.x con 'archivo-como' objeto:¿Cómo escribir bytes en un archivo en Python 3 sin conocer la codificación?

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

Cómo hacer lo mismo en Python 3?

cómo escribir equivalente de este código Python 2.x:

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

Nota: sys.stdout no siempre es semánticamente un flujo de texto. Podría ser beneficioso considerarlo como un flujo de bytes a veces. Por ejemplo, make encrypted archive of dir/ on remote machine:

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

no hay ningún punto para utilizar Unicode en este caso.

Respuesta

36

Se trata de utilizar API que operan en bytes, en lugar de cadenas.

sys.stdout.buffer.write(bytes_) 

A medida que el docs explicar, también detach las corrientes pueden, por lo que son binarios por defecto.

Esto accede al búfer de bytes subyacente.

tempfile.TemporaryFile().write(bytes_) 

Esto ya es un byte API.

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

Como era de esperar de la 'b', esta es una API de bytes.

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

BytesIO es el byte equivalente a StringIO.

EDITAR: write simplemente trabajará en cualquier binario objeto de tipo archivo. Entonces la solución general es solo encontrar la API correcta.

+0

¿Hay una manera de escribir función general sin recurrir a la comprobación de tipos como 'isinstance (file_, io .TextIOWrapper) ', etc. – jfs

+0

@JF, Python 3 está diseñado específicamente para manejar el texto v. División binaria correctamente. Sin conocer la codificación, no hay una forma correcta de ir entre el binario y el texto. Por lo tanto, no hay forma de escribir una función general que escriba bytes en una secuencia de texto. Dive Into Python 3 tiene un buen [artículo] (http://diveintopython3.org/strings.html) sobre esto. –

+0

La pregunta es específicamente sobre * bytes *. Por ejemplo, 'os.write (sys.stdout.fileno(), bytes_)'. – jfs

Cuestiones relacionadas