Das Schreiben und Lesen von In-Memory-Bytes (BytesIO) ergibt ein leeres Ergebnis

74

Ich wollte die Python BytesIO-Klasse ausprobieren.

Als Experiment habe ich versucht, in eine Zip-Datei im Speicher zu schreiben und dann die Bytes wieder aus dieser Zip-Datei zu lesen. Anstatt ein Dateiobjekt an zu übergeben gzip, übergebe ich ein BytesIOObjekt. Hier ist das gesamte Skript:

from io import BytesIO
import gzip

# write bytes to zip file in memory
myio = BytesIO()
g = gzip.GzipFile(fileobj=myio, mode='wb')
g.write(b"does it work")
g.close()

# read bytes from zip file in memory
g = gzip.GzipFile(fileobj=myio, mode='rb')
result = g.read()
g.close()

print(result)

Aber es gibt ein leeres bytesObjekt für zurück result. Dies geschieht sowohl in Python 2.7 als auch in 3.4. Was vermisse ich?

twasbrillig
quelle

Antworten:

131

Sie müssen zum seekAnfang der Datei zurückkehren, nachdem Sie die Initiale in die Speicherdatei geschrieben haben ...

myio.seek(0)
mgilson
quelle
7
Mit matplotlib savefig () gefüllte Puffer benötigen dies ebenfalls, bevor sie von einem Anwendungsserver gesendet werden können. Vielen Dank für die stundenlangen Recherchen!
TomTom101
Ich kam, ich sah, Daumen hoch. (2 Monate später) Ich kam, ich sah, ich wollte wieder Daumen hoch!
theaws.blog
1
Oder verwenden getvalue(). Diese kleinen Dinge sind überall verstreut!
theaws.blog
2

Wie wäre es, wenn wir gzip-Inhalte im selben Kontext wie diesen schreiben und lesen? Wenn dieser Ansatz gut ist und für Sie funktioniert, lesen Sie bitte +1 für diese Antwort, damit ich diesen Ansatz richtig kenne und für andere Personen arbeite.

#!/usr/bin/env python

from io import BytesIO
import gzip

content = b"does it work"

# write bytes to zip file in memory
gzipped_content = None
with BytesIO() as myio:
    with gzip.GzipFile(fileobj=myio, mode='wb') as g:
        g.write(content)
        g.close()
    gzipped_content = myio.getvalue()

print(gzipped_content)
print(content == gzip.decompress(gzipped_content))
Gatsby Lee
quelle