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!


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 .


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()

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 .


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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.