name font python binary io buffer

font - subplot python title



BĂșfer binario en Python (3)

En Python puede usar StringIO para un buffer similar a un archivo para datos de caracteres. El archivo mapeado en memoria básicamente hace algo similar para los datos binarios, pero requiere un archivo que se usa como base. ¿Tiene Python un objeto de archivo destinado a datos binarios y solo memoria, equivalente a ByteArrayOutputStream de Java?

El caso de uso que tengo es que quiero crear un archivo ZIP en la memoria, y ZipFile requiere un objeto similar a un archivo.


Probablemente estés buscando la clase io.BytesIO . Funciona exactamente como StringIO, excepto que admite datos binarios:

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

StringIO lanzará TypeError:

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


Mire el paquete struct: https://docs.python.org/library/struct.html , le permite interpretar cadenas como datos binarios empaquetados.

No estoy seguro si esto responderá completamente a su pregunta, pero puede usar struct.unpack () para convertir datos binarios a objetos Python.

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

En este ejemplo, el ">" dice que se lea big-endian, la "h" lee un byte corto de 2 bytes, y la "l" es para un byte de 4 bytes. obviamente puede cambiarlos a lo que necesite para leer los datos binarios ...


Siempre y cuando no intentes poner ningún tipo de datos Unicode en tu StringIO y tengas cuidado de NO usar cStringIO estarás bien.

De acuerdo con la documentación de StringIO , siempre que se mantenga unicode u 8 bits todo funciona como se espera. Presumiblemente, StringIO hace algo especial cuando alguien hace un f.write(u"asdf") (que ZipFile no hace, que yo sepa). De todas formas;

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 diferencia entre el archivo en el archivo resultante y el archivo original.

Si conoce un caso particular en el que este enfoque no funciona, estaría más interesado en saberlo :)