L'exemple fourni par Ethier présente plusieurs problèmes, dont certains sont majeurs :
- ne fonctionne pas pour les données réelles sous Windows. Un fichier ZIP est binaire et ses données doivent toujours être écrites avec un fichier ouvert 'wb'
- le fichier ZIP est complété pour chaque fichier, ce qui est inefficace. Il suffit de l'ouvrir et de le conserver en tant que fichier
InMemoryZip
attribut
- la documentation indique que les fichiers ZIP doivent être fermés explicitement, ce qui n'est pas fait dans la fonction append (cela fonctionne probablement (pour l'exemple) parce que zf sort du champ d'application et que cela ferme le fichier ZIP)
- l'indicateur create_system est activé pour tous les fichiers du fichier zip tous chaque fois qu'un fichier est ajouté au lieu d'une seule fois par fichier.
- sur Python < 3 cStringIO est beaucoup plus efficace que StringIO
- ne fonctionne pas avec Python 3 (l'article original date d'avant la sortie de la version 3.0, mais au moment où le code a été posté, la version 3.1 était sortie depuis longtemps).
Une version mise à jour est disponible si vous installez ruamel.std.zipfile
(dont je suis l'auteur). Après
pip install ruamel.std.zipfile
ou en incluant le code de la classe à partir de aquí vous pouvez faire :
import ruamel.std.zipfile as zipfile
# Run a test
zipfile.InMemoryZipFile()
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
imz.writetofile("test.zip")
Vous pouvez également écrire le contenu en utilisant imz.data
à n'importe quel endroit.
Vous pouvez également utiliser la fonction with
et si vous fournissez un nom de fichier, le contenu du ZIP sera écrit en quittant ce contexte :
with zipfile.InMemoryZipFile('test.zip') as imz:
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
grâce à l'écriture différée sur le disque, il est possible de lire un ancien disque. test.zip
dans ce contexte.