Binaire buffer in Python

stemmen
51

In Python kunt u gebruik maken StringIO voor een file-achtige buffer voor het karakter van de gegevens. -Geheugen toegewezen bestand in principe doet iets soortgelijks voor binaire data, maar het een bestand dat wordt gebruikt als de basis vereist. Heeft Python hebben een bestand object dat is bedoeld voor binaire gegevens en is slechts het geheugen, wat overeenkomt met Java's ByteArrayOutputStream ?

Het use-case die ik heb is ik wil een ZIP-bestand uit het geheugen te creëren, en ZipFile vereist een file-achtig object.

De vraag is gesteld op 24/08/2008 om 14:37
bron van user
In andere talen...                            


3 antwoorden

stemmen
3

Kijk naar de structuur pakket: https://docs.python.org/library/struct.html , staat het u om strings uitgeleverd binaire data te interpreteren.

Niet zeker of dit zal volledig antwoord op uw vraag, maar u kunt struct.unpack () gebruiken om binaire data om te zetten in python objecten.


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

int dit voorbeeld is de ">" vertelt te lezen big-endian de "h" leest een 2-byte kort, en de "l" is voor een 4-byte lang. U kunt uiteraard deze veranderen naar wat je nodig hebt om te lezen van de binaire data ...

antwoordde op 24/08/2008 om 14:50
bron van user

stemmen
24

Zolang je niet proberen om elke unicode gegevens in uw zetten StringIOen je bent voorzichtig niet te gebruiken cStringIOje moet wel goed.

Volgens de StringIO documentatie, zolang u zich houdt aan ofwel unicode of 8-bit alles werkt zoals verwacht. Vermoedelijk StringIOdoet iets bijzonders wanneer iemand een f.write(u"asdf")(die ZipFile niet doet, voor zover ik weet). Hoe dan ook;

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

werkt net zoals verwacht, en er is geen verschil tussen het bestand in de resulterende archief en het originele bestand.

Als u weet van een specifiek geval, waar deze aanpak niet werkt, zou ik het meest geïnteresseerd om te horen over het zijn :)

antwoordde op 24/08/2008 om 15:52
bron van user

stemmen
71

U bent waarschijnlijk op zoek naar io.BytesIO klasse. Het werkt precies hetzelfde als StringIO behalve dat het ondersteunt binaire data:

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

StringIO zal werpen TypeError:

from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")
antwoordde op 09/09/2011 om 05:34
bron van user

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