Extraire les fichiers du zip sans maintien de la structure à l'aide de python ZipFile?
J'essaie d'extraire tous les fichiers de .zip contenant des sous-dossiers dans un dossier. Je veux que tous les fichiers des sous-dossiers de l'extrait dans un seul dossier, sans garder la structure originale. Pour le moment, j'ai extrait tous les, déplacer les fichiers vers un dossier, puis supprimer les sous-dossiers. Les fichiers ayant le même nom sont écrasé.
Est-il possible de le faire avant d'écrire des fichiers?
Ici est une structure par exemple:
my_zip/file1.txt
my_zip/dir1/file2.txt
my_zip/dir1/dir2/file3.txt
my_zip/dir3/file4.txt
À la fin, je souhaite ceci:
my_dir/file1.txt
my_dir/file2.txt
my_dir/file3.txt
my_dir/file4.txt
Ce que je peux ajouter à ce code ?
import zipfile
my_dir = "D:\\Download\\"
my_zip = "D:\\Download\\my_file.zip"
zip_file = zipfile.ZipFile(my_zip, 'r')
for files in zip_file.namelist():
zip_file.extract(files, my_dir)
zip_file.close()
si je renomme le chemin des fichiers à partir de zip_file.namelist(), j'ai cette erreur:
KeyError: "There is no item named 'file2.txt' in the archive"
Vous devez vous connecter pour publier un commentaire.
Cela ouvre des descripteurs de fichier des membres de l'archive zip, extrait le nom de fichier et la copie d'un fichier cible (c'est comment
ZipFile.extract
œuvres, sans prendre soin de les sous-répertoires).Il est possible d'itérer sur les
ZipFile.infolist()
. Sur le retour de l'ZipInfo
objets que vous pouvez manipuler l'filename
de supprimer le répertoire de la partie et enfin l'extraire dans un répertoire spécifié.Il suffit d'extraire d'octets en mémoire,calculez le nom de fichier, et de l'écrire là-même,
au lieu de laisser la bibliothèque de le faire - -pour la plupart, il suffit d'utiliser le "read()" au lieu de "extract()" méthode:
Un concept similaire à la solution de Gerhard Götz, mais adapté pour extraire les fichiers au lieu de l'ensemble de la zip:
Dans le cas où vous êtes l'obtention de badZipFile erreur. vous pouvez décompresser l'archive à l'aide de 7zip sous-processus. en supposant que vous avez installé le 7zip puis utiliser le code suivant.