tampão de binário em Python

votos
51

Em Python, você pode usar StringIO para um buffer de arquivo, como para dados de caracteres. Arquivo de memória mapeada basicamente faz coisa semelhante para dados binários, mas requer um arquivo que é usado como base. O Python tem um objeto de arquivo que é destinado a dados binários e só é memória, equivalente ao de Java ByteArrayOutputStream ?

O caso de uso que eu tenho é que eu quero criar um arquivo ZIP na memória, e ZipFile requer um objeto de arquivo-like.

Publicado 24/08/2008 em 16:37
fonte usuário
Em outras línguas...                            


3 respostas

votos
71

Você provavelmente está procurando io.BytesIO classe. Ele funciona exatamente como StringIO exceto que ele suporta dados binários:

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

StringIO vai jogar TypeError:

from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")
Respondeu 09/09/2011 em 07:34
fonte usuário

votos
24

Contanto que você não tentar colocar quaisquer dados unicode em seu StringIOe você é cuidado para não usar cStringIOvocê deve ser fino.

De acordo com o StringIO documentação, desde que você mantenha a obras como esperado Unicode ou tudo o 8-bits. Presumivelmente, StringIOfaz algo especial quando alguém faz uma f.write(u"asdf")(que ZipFile não fazer, que eu saiba). De qualquer forma;

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 apenas como esperado, e não há nenhuma diferença entre o arquivo no arquivo resultante e o arquivo original.

Se você souber de um caso particular em que esta abordagem não funciona, eu estaria mais interessado em ouvir sobre isso :)

Respondeu 24/08/2008 em 17:52
fonte usuário

votos
3

Olhe para o pacote de struct: https://docs.python.org/library/struct.html , que lhe permite interpretar strings como dados binários embalados.

Não tenho certeza se isso vai responder completamente sua pergunta, mas você pode usar struct.unpack () para converter dados binários para objetos python.


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

int Neste exemplo, a ">" conta a ler big-endian o "h", diz um 2-byte curto, e "l" é para um 4-byte. Você pode, obviamente, mudar estes para tudo o que você precisa ler para fora do dados binários ...

Respondeu 24/08/2008 em 16:50
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more