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?

Antworten:


131

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

myio.seek(0)

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))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.