Vra

In Python kan jy gebruik StringIO vir 'n lêer-agtige buffer vir karakter data. -geheue gekarteer lêer basies doen soortgelyke ding vir binêre data, maar dit 'n lêer wat vereis gebruik as die basis. Maak Python 'n lêer voorwerp wat bedoel is vir binêre data en is slegs geheue, gelykstaande aan Java se ByteArrayOutputStream ?

Die gebruik-geval ek het is ek wil 'n zip-lêer in geheue te skep, en zipfile vereis 'n lêer-agtige voorwerp.

Was dit nuttig?

Oplossing

Jy is waarskynlik op soek na io.BytesIO klas. Dit werk presies soos StringIO behalwe dat dit word ondersteun deur binêre data:

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

StringIO sal gooi TypeError:

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

Ander wenke

Solank as wat jy nie probeer om enige unicode data in jou StringIO sit en jy is versigtig om nie te cStringIO gebruik jy moet goed wees.

Volgens die StringIO dokumentasie, so lank as wat jy hou om óf unicode of 8-stukkies alles werk soos verwag. Vermoedelik, StringIO doen iets spesiaals wanneer iemand 'n f.write(u"asdf") doen (wat zipfile nie doen nie, na my wete). In elk geval,

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

werk net so verwag, en daar is geen verskil tussen die lêer in die gevolglike argief en die oorspronklike lêer.

As jy weet van 'n bepaalde geval waar hierdie benadering nie werk nie, ek wil die meeste belangstel om te hoor oor dit:)

Kyk na die struct pakket: https://docs.python.org/library/struct Html , dit laat jou toe om stringe as verpak binêre data te interpreteer.

nie seker of dit heeltemal jou vraag sal beantwoord, maar jy kan struct.unpack () te gebruik om binêre data te omskep in python voorwerpe.


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

int hierdie voorbeeld, die ">" vertel om groot-endian lees die "h" lui 'n 2-byte kort, en die "l" is vir 'n 4-byte lank. jy kan natuurlik hierdie verander na alles wat jy nodig het om te lees uit die binêre data ...

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top