Décompresser des fichiers en Python

Réponses:

787
import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
    zip_ref.extractall(directory_to_extract_to)

C'est à peu près ça!

Rahul
la source
7
que faire si le contenu de l'archive .zip est le même, dans toutes les archives .zip? comment renommer le contenu avant de l'extraire? exemple: 1.zip 2.zip .. contiennent tous content.txt: extraire tout comme 1content.txt 2content.txt?
iratzhash
8
@iratzhash Je crée généralement un nouveau répertoire temporaire pour le contenu en utilisant tempfile: docs.python.org/3/library/tempfile.html Je décompresse le répertoire temporaire et je déplace / organise les fichiers à partir de là.
Dave Forgac
8
@ 3kstc je le ferais from zipfile import ZipFile. Lorsque vous l'utilisez, vous n'avez plus besoin d'utiliser zipfile.ZipFileet pouvez utiliser ZipFile(zip_file_name).
Debug255
@iratzhash Je me rends compte que vous avez commenté il y a 1,5 ans. Mais pour que les autres le sachent, le contenu d'un fichier zip est généralement en lecture seule. Une bonne réponse est ici par "bouke"
Debug255
Une sorte de méta-note, mais l'édition de novembre 2018 la rend à peu près identique à une autre réponse qui utilisait déjà le gestionnaire de contexte (et des liens vers ce que cela signifie).
Engineero
304

Si vous utilisez Python 3.2 ou version ultérieure:

import zipfile
with zipfile.ZipFile("file.zip","r") as zip_ref:
    zip_ref.extractall("targetdir")

Vous n'avez pas besoin d'utiliser close ou try / catch avec cela car il utilise la construction du gestionnaire de contexte .

user1741137
la source
18
ZipFile fonctionne également en tant que gestionnaire de contexte dans 2.7 ou version ultérieure: docs.python.org/2/library/zipfile.html#zipfile.ZipFile
FelixEnescu
Comment gérer l' exception docs.python.org/3.6/library/zipfile.html#zipfile.BadZipFile ? En général, quelle est la meilleure pratique à utiliser try / except avec le gestionnaire de contexte (with-statement)?
SnowOnion
1
zipfile+ pathlib= gagner. ça vous dérange si je mets légèrement à jour votre réponse?
Datanovice
39

Utilisez la extractallméthode, si vous utilisez Python 2.6+

zip = ZipFile('file.zip')
zip.extractall()
Dan Breen
la source
Vous n'avez pas besoin de spécifier une destination (zip.extractall (destination))?
asonnenschein
3
Pas si vous extrayez simplement dans le même répertoire que le fichier zip
Dan Gayle
10
@DanGayle, cela semble extraire le fichier zip dans le répertoire de travail actuel, PAS l'emplacement du fichier zip
Brian Leishman
4
pour moi, ZipFile () n'a pas fonctionné mais zipfile.ZipFile () a fonctionné - après l'importation zipfile
Agile Bean
6

Vous pouvez également importer uniquement ZipFile:

from zipfile import ZipFile
zf = ZipFile('path_to_file/file.zip', 'r')
zf.extractall('path_to_extract_folder')
zf.close()

Fonctionne en Python 2 et Python 3 .

simhumileco
la source
1
Merci de votre attention @MylesHollowed Cependant, ce n'est pas une copie de la réponse acceptée. Je suis d'accord qu'ils sont similaires les uns aux autres, mais ils sont différents. Cela est également indiqué par votre commentaire, car celui qui est accepté est certainement meilleur pour vous que le mien. S'il s'agissait d'une copie, ce serait la même chose ... Pour quelqu'un ma réponse peut être utile car elle est peut-être plus lisible et comme vous l'avez remarqué importer moins de code ... C'est à cause de ces différences que j'ai décidé de mettre ma réponse pour donner une alternative. N'est-ce pas pourquoi nous pouvons mettre d'autres réponses après en avoir accepté une? Tout le meilleur
simhumileco
Quel est le problème avec cette réponse? Pourquoi quelqu'un lui a-t-il donné un point négatif? Après tout, c'est la réponse à la question et se distingue par sa simplicité par rapport aux autres réponses, ce qui peut être important pour certaines personnes qui recherchent une réponse. N'est-ce pas?
simhumileco
1
@MylesHollowed import zipfile.ZipFilegénère ModuleNotFoundError: No module named 'zipfile.ZipFile'; 'zipfile' is not a packageen 3.6.5. Je suis ouvert à ce que ce soit une erreur d'opérateur de ma part, mais je ne sais pas ce que c'est.
MikeF
6

essaye ça :


import zipfile
def un_zipFiles(path):
    files=os.listdir(path)
    for file in files:
        if file.endswith('.zip'):
            filePath=path+'/'+file
            zip_file = zipfile.ZipFile(filePath)
            for names in zip_file.namelist():
                zip_file.extract(names,path)
            zip_file.close() 

path: décompressez le chemin du fichier

Fait Jin
la source
3
import os 
zip_file_path = "C:\AA\BB"
file_list = os.listdir(path)
abs_path = []
for a in file_list:
    x = zip_file_path+'\\'+a
    print x
    abs_path.append(x)
for f in abs_path:
    zip=zipfile.ZipFile(f)
    zip.extractall(zip_file_path)

Cela ne contient pas de validation pour le fichier s'il n'est pas compressé. Si le dossier contient un fichier non .zip, il échouera.

user3911901
la source