Binary buffer i Python

stemmer
52

I Python kan du bruke StringIO etter en fil-lignende buffer for tegndata. Minnetilordnet fil i utgangspunktet gjør lignende ting for binære data, men det krever en fil som brukes som grunnlag. Har Python har en fil objekt som er beregnet for binære data og er minne, tilsvarende Java ByteArrayOutputStream ?

Bruken-saken jeg har er at jeg ønsker å opprette en ZIP-fil i minnet, og zipfile krever en fil lignende gjenstand.

Publisert på 24/08/2008 klokken 15:37
kilden bruker
På andre språk...                            


3 svar

stemmer
73

Du er sannsynligvis ute etter io.BytesIO klasse. Det fungerer akkurat som StringIO, bortsett fra at den støtter binære data:

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

StringIO vil kaste Feiltype:

from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")
Svarte 09/09/2011 kl. 06:34
kilden bruker

stemmer
24

Så lenge du ikke prøver å sette noen Unicode-data inn StringIOog du er forsiktig med å bruke cStringIOdu bør være i orden.

Ifølge StringIO dokumentasjon, så lenge du holder deg til enten unicode eller 8-bits alt fungerer som forventet. Antagelig StringIOgjør noe spesielt når noen gjør en f.write(u"asdf")(som zipfile ikke gjør det, så vidt jeg vet). Uansett;

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()

fungerer akkurat som forventet, og det er ingen forskjell mellom filen i den resulterende arkivet og den opprinnelige filen.

Hvis du vet om en bestemt sak hvor denne tilnærmingen ikke fungerer, vil jeg være mest interessert i å høre om det :)

Svarte 24/08/2008 kl. 16:52
kilden bruker

stemmer
3

Se på struct pakken: https://docs.python.org/library/struct.html , det kan du tolke strenger som pakket binære data.

Ikke sikker på om dette vil helt svare på spørsmålet ditt, men du kan bruke struct.unpack () for å konvertere binære data til python stedene.


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

int dette eksemplet ">" forteller til å lese big-endian "h" leser en 2-byte kort, og "l" er for en 4-byte lang. du kan selvsagt endre disse til det du trenger å lese ut av binære data ...

Svarte 24/08/2008 kl. 15:50
kilden bruker

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