Frage

In Python können Sie verwenden StringIO für eine dateiähnliche Puffer für Zeichendaten. Memory-Mapped-Datei grundsätzlich ähnlich, was für binäre Daten der Fall ist, aber es erfordert eine Datei, die ist als Grundlage verwendet. Hat Python ein Datei-Objekt, das für binäre Daten bestimmt ist, und ist der Speicher nur, das entspricht Javas ByteArrayOutputStream ?

Die Use-Case ich habe, bin ich mag eine ZIP-Datei im Speicher erstellen, und ZipFile erfordert ein dateiähnliche Objekt.

War es hilfreich?

Lösung

Sie suchen wahrscheinlich für io.BytesIO Klasse. Es funktioniert genau wie StringIO außer dass es Binärdaten unterstützt:

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

StringIO wird werfen Typeerror:

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

Andere Tipps

Solange Sie versuchen, keine Unicode-Daten in Ihre StringIO zu setzen und Sie sind vorsichtig, nicht cStringIO verwenden Sie sollte in Ordnung sein.

Nach der StringIO Dokumentation, solange Sie entweder Unicode halten oder 8-Bit alles wie erwartet funktioniert. Vermutlich tut StringIO etwas Besonderes, wenn jemand eine f.write(u"asdf") tut (die ZipFile nicht tun, mein Wissen). Wie dem auch sei;

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

funktioniert genau wie erwartet, und es gibt keinen Unterschied zwischen der Datei in dem resultierenden Archiv und die Originaldatei.

Wenn Sie von einem bestimmten Fall wissen, wo dieser Ansatz nicht funktioniert, würde ich mich am meisten interessiert, davon zu hören:)

Schauen Sie sich die Struktur Paket: https://docs.python.org/library/struct .html ermöglicht es Ihnen, Strings als gepackte binäre Daten zu interpretieren.

Nicht sicher, ob dies vollständig Ihre Frage beantworten, aber Sie können struct.unpack () verwenden, um binäre Daten zu Python-Objekten zu umwandeln.


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

int diesem Beispiel wird die ">" sagt Big-Endian das "h" liest ein 2-Byte kurz zu lesen, und die "l" ist für ein 4-Byte lang. Sie können diese offensichtlich ändern, was Sie brauchen, um aus den binären Daten zu lesen ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top