Pregunta

En Python puede usar StringIO para un búfer tipo archivo para datos de caracteres. archivo mapeado en memoria básicamente hace algo similar para datos binarios, pero requiere un archivo que sea Utilizado como base. ¿Python tiene un objeto de archivo destinado a datos binarios y es solo de memoria, equivalente a ByteArrayOutputStream ?

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.

¿Fue útil?

Solución

Probablemente esté 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 arrojará TypeError:

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

Otros consejos

Mientras no intentes poner ningún dato Unicode en tu StringIO y tengas cuidado de NO usar cStringIO , deberías estar bien.

De acuerdo con la documentación de StringIO , siempre que se mantenga unicode o 8 bits todo funciona como se esperaba. Presumiblemente, StringIO hace algo especial cuando alguien hace un f.write (u " asdf ") (que ZipFile no hace, que yo sepa). 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 diferencia entre el archivo en el archivo resultante y el archivo original.

Si conoces un caso particular en el que este enfoque no funciona, me interesaría mucho saberlo :)

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

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


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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top