web-dev-qa-db-fra.com

L'écriture puis la lecture d'octets en mémoire (BytesIO) donne un résultat vierge

Je voulais essayer la classe python BytesIO.

À titre d'expérience, j'ai essayé d'écrire dans un fichier Zip en mémoire, puis de lire les octets de ce fichier Zip. Donc, au lieu de passer un objet fichier à gzip, je passe un objet BytesIO. Voici l'intégralité du script:

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)

Mais il renvoie un objet bytes vide pour result. Cela se produit dans les deux Python 2.7 et 3.4. Qu'est-ce qui me manque?

51
twasbrillig

Vous devez seek revenir au début du fichier après avoir écrit le fichier initial dans la mémoire ...

myio.seek(0)
81
mgilson

Que diriez-vous d'écrire et de lire du contenu gzip dans le même contexte comme celui-ci? Si cette approche est bonne et fonctionne pour vous qui lisez ceci, veuillez +1 pour cette réponse afin que je sache que cette approche est correcte et fonctionne pour d'autres personnes?

#!/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))
0
Gatsby Lee