Supprimer le fichier de zipfile avec le Module ZipFile
La seule façon dont je suis venu pour la suppression d'un fichier à partir d'un zipfile était de créer un temporaire zipfile sans le fichier à supprimer, puis renommez-le avec le nom de fichier d'origine.
En python 2.4 le ZipInfo classe avait un attribut file_offset
, de sorte qu'il était possible de créer un deuxième fichier zip et copier les données dans un autre fichier sans le décompresser/recompresser ensuite.
Ce file_offset
est manquant dans la version 2.6 de python, donc, il y a une autre option que d'en créer un autre zipfile par décompresser tous les fichiers et puis recompresser ensuite de nouveau?
Est là peut-être une façon directe de la suppression d'un fichier dans le zipfile, j'ai cherché et n'ai rien trouvé.
- J'ai trouvé ce fil de discussion sur le Python bug tracker de discuter les difficultés de la suppression de fichiers à partir d'un fichier zip: bugs.python.org/issue6818
Vous devez vous connecter pour publier un commentaire.
L'extrait suivant a fonctionné pour moi (supprime tous les *.les fichiers exe à partir d'une archive Zip):
Si vous lisez tout en mémoire, vous pouvez éliminer le besoin d'un deuxième fichier. Cependant, cet extrait recompresse tout.
Après une inspection plus minutieuse de la
ZipInfo.header_offset
est le décalage à partir du début du fichier. Le nom est trompeur, mais le Zip principal de l'en-tête est en fait stockée à la fin du fichier. Mon éditeur hexadécimal, le confirme.Donc le problème que vous allez rencontrer est la suivante: Vous devez supprimer l'entrée de répertoire dans l'en-tête principal ainsi ou il pointe vers un fichier qui n'existe plus. Laissant l'en-tête principal intacte pourrait fonctionner si vous gardez les locaux de l'en-tête du fichier à supprimer, mais je ne suis pas sûr à ce sujet. Comment avez-vous fait avec l'ancien module?
Sans modifier l'en-tête principal, j'obtiens une erreur "missing X octets dans zipfile" quand je l'ouvre. Cette peut vous aider à trouver comment modifier l'en-tête principal.
Pas très élégant mais c'est la façon dont je l'ai fait:
ZipFile
ne semble pas disposer d'un moyen de supprimer ou mettre à jour/réinstallation de fichiers.La routine
delete_from_zip_file
deruamel.std.zipfile
1 permet de supprimer un fichier en fonction de son chemin d'accès complet au sein de la ZIP, ou sur la base (re
) les modèles. E. g. vous pouvez supprimer tous les.exe
des fichiers à partir detest.zip
à l'aide de(veuillez noter le point avant le
*
).Cela fonctionne de la même pour la solution de mdm (y compris le besoin de recompression), mais il recrée le fichier ZIP dans la mémoire (utilisation de la classe
InMemZipFile()
), en écrasant l'ancien fichier après il est entièrement lu.1 Disclaimer: je suis l'auteur de ce paquet.
allowZip64
, aucune idée de ce que c'est.