53 votos

Binario de búfer en Python

En Python se puede utilizar StringIO de un archivo-como buffer para los datos de caracteres. Archivo asignado en memoria básicamente hace lo mismo para los datos binarios, pero se requiere un archivo que se utiliza como base. Qué Python tiene un archivo objeto que está pensado para los datos binarios y es sólo memoria, equivalente a Java ByteArrayOutputStream?

El caso de uso que tengo es que quiero crear un archivo ZIP en la memoria, y el fichero zip requiere un archivo objeto.

75voto

akhan Puntos 677

Usted está probablemente en busca de io.BytesIO clase. Funciona exactamente igual que StringIO excepto que es compatible con datos binarios:

from io import BytesIO
bio = BytesIO(b"some initial binary data: \x00\x01")

StringIO va a tirar TypeError:

from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")

24voto

Henrik Gustafsson Puntos 11755

Mientras que usted no trate de poner los datos unicode en su StringIO y usted tiene cuidado de NO usar cStringIO usted debe estar bien.

De acuerdo a la StringIO documentación, siempre y cuando mantenga a unicode o de 8 bits, todo funciona como se espera. Presumiblemente, StringIO hace algo especial cuando alguien hace una f.write(u"asdf") (fichero zip que no, a mi conocimiento). De todos modos;

import zipfile
import StringIO

s = StringIO.StringIO()
z = zipfile.ZipFile(s, "w")
z.write("test.txt")
z.close()
f = file("x.zip", "w")
f.write(s.getvalue())
s.close()
f.close()

funciona como se esperaba, y no hay ninguna diferencia entre el archivo en el archivo resultante y el archivo original.

Si usted sabe de un caso en particular donde este enfoque no funciona, yo estaría más interesado en escuchar acerca de ella :)

3voto

mmattax Puntos 10865

Mira la estructura del paquete: http://docs.python.org/lib/module-struct.html, que permite interpretar las cadenas como lleno de datos binarios.

No estoy seguro si esto va completamente responder a su pregunta, pero usted puede utilizar struct.unpack() para convertir los datos binarios a los objetos de python.


import struct
f = open(filename, "rb")
s = f.read(8)
x, y = struct.unpack(">hl", s)

int este ejemplo, el ">" le dice a leer big-endian la "h", se lee en un 2-byte short, y la "l" es de 4 bytes de largo. usted, evidentemente, puede cambiar estos para lo que sea necesario para la lectura de los datos binarios...

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X