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?
Vous devez seek
revenir au début du fichier après avoir écrit le fichier initial dans la mémoire ...
myio.seek(0)
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))