Accéder au contenu principal

Travailler avec des fichiers ZIP en Python

Dans ce tutoriel, vous allez apprendre à manipuler des fichiers ZIP en Python avec le module zipfile. zipfile est un module intégré à Python.
Actualisé 19 sept. 2026  · 13 min lire

Explorer avec l’IA

ChatGPTClaudePerplexity

Prérequis pour travailler avec des fichiers ZIP

\n
    \n
  • Vous devez connaître la gestion des fichiers en Python pour comprendre la gestion des fichiers ZIP. Si ce n’est pas le cas, consultez la section File Handling de W3Schools.
  • \n
\n
    \n
  • Les principes de la POO (OOP) en Python
  • \n
\n
    \n
  • Des notions Python comme les conditionnelles, les boucles, les fonctions, les classes, etc.
  • \n
\n\n

Ouvrez ce lien pour télécharger tous les dossiers ZIP utilisés dans les sections suivantes.

\n

Qu’est-ce qu’un fichier ZIP ?

\n

Un ZIP est un format d’archive qui prend en charge la compression de données sans perte. Un fichier ZIP est un fichier unique contenant un ou plusieurs fichiers compressés.

\n

À quoi sert un fichier ZIP ?

\n
    \n
  • Les fichiers ZIP vous permettent de regrouper des fichiers liés au même endroit.
  • \n
\n
    \n
  • Les fichiers ZIP aident à réduire la taille des données.
  • \n
\n
    \n
  • Les fichiers ZIP se transfèrent plus vite que des fichiers individuels sur de nombreuses connexions.
  • \n
\n

Le module zipfile

\n

Explorez toutes les méthodes et classes du module zipfile avec la fonction dir(). Voici le code pour obtenir toutes les classes et méthodes du module zipfile.

\n
import zipfile # importing the 'zipfile' module\n\nprint(dir(zipfile))\n
\n
['BZIP2_VERSION', 'BadZipFile', 'BadZipfile', 'DEFAULT_VERSION', 'LZMACompressor', 'LZMADecompressor', 'LZMA_VERSION', 'LargeZipFile', 'MAX_EXTRACT_VERSION', 'PyZipFile', 'ZIP64_LIMIT', 'ZIP64_VERSION', 'ZIP_BZIP2', 'ZIP_DEFLATED', 'ZIP_FILECOUNT_LIMIT', 'ZIP_LZMA', 'ZIP_MAX_COMMENT', 'ZIP_STORED', 'ZipExtFile', 'ZipFile', 'ZipInfo', '_CD64_CREATE_VERSION', '_CD64_DIRECTORY_RECSIZE', '_CD64_DIRECTORY_SIZE', '_CD64_DISK_NUMBER', '_CD64_DISK_NUMBER_START', '_CD64_EXTRACT_VERSION', '_CD64_NUMBER_ENTRIES_THIS_DISK', '_CD64_NUMBER_ENTRIES_TOTAL', '_CD64_OFFSET_START_CENTDIR', '_CD64_SIGNATURE', '_CD_COMMENT_LENGTH', '_CD_COMPRESSED_SIZE', '_CD_COMPRESS_TYPE', '_CD_CRC', '_CD_CREATE_SYSTEM', '_CD_CREATE_VERSION', '_CD_DATE', '_CD_DISK_NUMBER_START', '_CD_EXTERNAL_FILE_ATTRIBUTES', '_CD_EXTRACT_SYSTEM', '_CD_EXTRACT_VERSION', '_CD_EXTRA_FIELD_LENGTH', '_CD_FILENAME_LENGTH', '_CD_FLAG_BITS', '_CD_INTERNAL_FILE_ATTRIBUTES', '_CD_LOCAL_HEADER_OFFSET', '_CD_SIGNATURE', '_CD_TIME', '_CD_UNCOMPRESSED_SIZE', '_ECD_COMMENT', '_ECD_COMMENT_SIZE', '_ECD_DISK_NUMBER', '_ECD_DISK_START', '_ECD_ENTRIES_THIS_DISK', '_ECD_ENTRIES_TOTAL', '_ECD_LOCATION', '_ECD_OFFSET', '_ECD_SIGNATURE', '_ECD_SIZE', '_EndRecData', '_EndRecData64', '_FH_COMPRESSED_SIZE', '_FH_COMPRESSION_METHOD', '_FH_CRC', '_FH_EXTRACT_SYSTEM', '_FH_EXTRACT_VERSION', '_FH_EXTRA_FIELD_LENGTH', '_FH_FILENAME_LENGTH', '_FH_GENERAL_PURPOSE_FLAG_BITS', '_FH_LAST_MOD_DATE', '_FH_LAST_MOD_TIME', '_FH_SIGNATURE', '_FH_UNCOMPRESSED_SIZE', '_SharedFile', '_Tellable', '_ZipDecrypter', '_ZipWriteFile', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_check_compression', '_check_zipfile', '_get_compressor', '_get_decompressor', 'binascii', 'bz2', 'compressor_names', 'crc32', 'error', 'importlib', 'io', 'is_zipfile', 'lzma', 'main', 'os', 're', 'shutil', 'sizeCentralDir', 'sizeEndCentDir', 'sizeEndCentDir64', 'sizeEndCentDir64Locator', 'sizeFileHeader', 'stat', 'stringCentralDir', 'stringEndArchive', 'stringEndArchive64', 'stringEndArchive64Locator', 'stringFileHeader', 'struct', 'structCentralDir', 'structEndArchive', 'structEndArchive64', 'structEndArchive64Locator', 'structFileHeader', 'sys', 'threading', 'time', 'zlib']\n
\n

Vous venez de voir une liste de classes et de méthodes. Mais vous n’allez pas toutes les apprendre. Nous nous concentrerons sur quelques classes et méthodes utiles pour travailler avec les fichiers ZIP.

\n

Voyons quelques exceptions, classes et méthodes avec de brèves explications.

\n

Exceptions

\n

Une exception est un message permettant d’afficher l’erreur précise comme vous le souhaitez. En Python, vous utilisez les mots-clés try, except, finally pour la gestion des erreurs.

\n

Si vous n’êtes pas à l’aise avec la gestion des erreurs, consultez la documentation Error Handling de Python.

\n

Voici les exceptions du module zipfile.

\n

zipfile.BadZipFile

\n

zipfile.BadZipFile est une exception du module zipfile. Cette erreur est levée pour les fichiers ZIP corrompus. Exemple :

\n
## zipfile.BadZipFile\nimport zipfile\n\ndef main():\n    try:\n        with zipfile.ZipFile('sample_file.zip') as file: # opening the zip file using 'zipfile.ZipFile' class\n            print(\"Ok\")\n    except zipfile.BadZipFile: # if the zip file has any errors then it prints the error message which you wrote under the 'except' block\n        print('Error: Zip file is corrupted')\n\nif __name__ == '__main__': main()\n\n## I used a badfile for the test\n
\n
Ok
\n

zipfile.LargeZipFile

\n

Si vous voulez travailler avec un gros ZIP, vous devez activer la fonctionnalité ZIP64 à l’ouverture. Sinon, une exception LargeZipFile sera levée. Exemple :

\n
## zipfile.LargeZipFile\n## Without enabling 'Zip64'\nimport zipfile\n\ndef main():\n    try:\n        with zipfile.ZipFile('sample_file.zip') as file:\n            print('File size is compatible')\n    except zipfile.LargeZipFile: # it raises an 'LargeZipFile' error because you didn't enable the 'Zip64'\n        print('Error: File size if too large')\n\nif __name__ == '__main__': main()\n
\n
File size is compatible\n
\n
## zipfile.LargeZipFile\n## With enabling 'ZIP64'\nimport zipfile\n\ndef main():\n    try:\n        with zipfile.ZipFile('sample_file.zip', mode = 'r', allowZip64 = True) as file: # here enabling the 'Zip64'\n            print('File size is compatible')\n    except zipfile.LargeZipFile:\n        print('Error: File size if too large') # if the file size is too large to open it prints the error you have written\n\nif __name__ == '__main__': main()\n
\n
File size is compatible\n
\n

Choisissez un fichier ZIP adapté pour tester la gestion des exceptions, puis exécutez le programme. Vous comprendrez mieux.

\n

Classes

\n

En bref, une classe regroupe des méthodes et des attributs. Vous utilisez ses méthodes et attributs où vous voulez en créant des instances de cette classe.

\n

Voyons quelques classes du module zipfile.

\n

zipfile.ZipFile

\n

La classe la plus courante pour travailler avec les fichiers ZIP est ZipFile.

\n

zipfile.ZipFile permet de lire et d’écrire des fichiers ZIP. Elle propose des méthodes pour manipuler ces archives.

\n

Explorez maintenant les méthodes de la classe ZipFile avec dir(). Voyez le code :

\n
import zipfile\n\nprint(dir(zipfile.ZipFile)) # accessing the 'ZipFile' class\n
\n
['_RealGetContents', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_extract_member', '_fpclose', '_open_to_write', '_sanitize_windows_name', '_windows_illegal_name_trans_table', '_write_end_record', '_writecheck', 'close', 'comment', 'extract', 'extractall', 'fp', 'getinfo', 'infolist', 'namelist', 'open', 'printdir', 'read', 'setpassword', 'testzip', 'write', 'writestr']\n
\n

Vous avez déjà utilisé la classe zipfile.ZipFile pour lire des fichiers ZIP dans les exemples précédents.

\n

zipfile.ZipFile contient de nombreuses méthodes comme extract, open, getinfo, setpassword, etc., pour travailler avec les fichiers ZIP.

\n

Voyons quelques méthodes de la classe ZipFile.

\n
## zipfile.ZipFile\nimport zipfile\n\ndef main():\n    with zipfile.ZipFile('sample_file.zip') as file:\n\n        # ZipFile.infolist() returns a list containing all the members of an archive file\n        print(file.infolist())\n\n        # ZipFile.namelist() returns a list containing all the members with names of an archive file\n        print(file.namelist())\n\n        # ZipFile.getinfo(path = filepath) returns the information about a member of Zip file.\n        # It raises a KeyError if it doesn't contain the mentioned file\n        print(file.getinfo(file.namelist()[-1]))\n\n        # ZipFile.open(path = filepath, mode = mode_type, pwd = password) opens the members of an archive file\n        # 'pwd' is optional -> if it has password mention otherwise leave it\n        text_file = file.open(name = file.namelist()[-1], mode = 'r')\n\n        # 'read()' method of the file prints all the content of the file. You see this method in file handling.\n        print(text_file.read())  \n\n        # You must close the file if you don't open a file using 'with' keyword\n        # 'close()' method is used to close the file\n        text_file.close()\n\n        # ZipFile.extractall(path = filepath, pwd = password) extracts all the files to current directory\n        file.extractall()\n        # after executing check the directory to see extracted files\n\n\nif __name__ == '__main__': main()\n
\n
[<ZipInfo filename='extra_file.txt' filemode='-rw-rw-rw-' file_size=59>, <ZipInfo filename='READ ME.txt' filemode='-rw-rw-rw-' file_size=59>, <ZipInfo filename='even_odd.py' filemode='-rw-rw-rw-' file_size=129>]\n['extra_file.txt', 'READ ME.txt', 'even_odd.py']\n<ZipInfo filename='even_odd.py' filemode='-rw-rw-rw-' file_size=129>\nb\"num = int(input('Enter a Number:- '))\\r\\nif num % 2 == 0:\\r\\n\\tprint('{} is Even'.fromat(num))\\r\\nelse:\\r\\n\\tprint('{} is Odd'.fromat(num))\"\n
\n

Pour découvrir toutes les méthodes de la classe ZipFile, utilisez la fonction help() sur la méthode qui vous intéresse.

\n

Vous pouvez aussi consulter la documentation officielle de Python.

\n

zipfile.ZipInfo

\n

La classe zipfile.ZipInfo représente un élément (membre) d’un dossier ZIP.

\n

Commencez par explorer tous les objets de la classe zipfile.ZipInfo avec dir(). Voir le code ci-dessous.

\n
## zipfile.ZipInfo\nimport zipfile\n\nprint(dir(zipfile.ZipInfo))\n
\n
['CRC', 'FileHeader', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_decodeExtra', '_encodeFilenameFlags', '_raw_time', 'comment', 'compress_size', 'compress_type', 'create_system', 'create_version', 'date_time', 'external_attr', 'extra', 'extract_version', 'file_size', 'filename', 'flag_bits', 'from_file', 'header_offset', 'internal_attr', 'is_dir', 'orig_filename', 'reserved', 'volume']\n
\n

Voyons maintenant quelques méthodes de la classe zipfile.ZipInfo.

\n
## zipfile.ZipInfo\nimport zipfile\n\n\ndef main():\n    with zipfile.ZipFile('sample_file.zip') as file:\n\n        # 'infolist()' is the object of 'ZipFile' class\n        # 'infolist()' returns a list containing all the folders and files of the zip -> 'ZipInfo' objects\n        # assigning last element of the list to a variable to test all the methods of 'ZipInfo'\n        archive = file.infolist()\n        read_me_file = archive[-1]\n\n        # 'ZipInfo' methods\n\n        # ZipInfo_object.filename returns the name of the file\n        print(\"Name of the file:- {}\".format(read_me_file.filename))\n\n        # ZipInfo_object.file_size returns the size of the file\n        print(\"Size of the file:- {}\".format(read_me_file.file_size))\n\n        # ZipInfo_object.is_dir() returns True if it's directory otherwise False\n        print(\"Is directory:- {}\".format(read_me_file.is_dir()))\n\n        # ZipInfo_object.date_time() returns the created date & time of file\n        print(\"File created data & time:- {}\".format(read_me_file.date_time))\n\nif __name__ == '__main__': main()\n
\n
Name of the file:- sample_file/READ ME.txt\nSize of the file:- 59\nIs directory:- False\nFile created data & time:- (2018, 10, 4, 11, 32, 22)\n
\n

Consultez ZipInfo si vous voulez en savoir plus sur les objets de ZipInfo.

\n

Méthodes

\n

Les méthodes sont des blocs de code dédiés à une fonctionnalité précise. Par exemple, pour obtenir la valeur absolue d’un nombre, vous pouvez utiliser la méthode intégrée de Python appelée abs.

\n

Vous pouvez les utiliser partout où c’est nécessaire. Voyons quelques méthodes du module zipfile.

\n

zipfile.is_zipfile()

\n

La méthode is_zipfile(filename) du module zipfile renvoie True si le fichier est un ZIP valide, sinon False.

\n

Exemple :

\n
## zipfile.is_zip(filename)\nimport zipfile\n\ndef main():\n    print(zipfile.is_zipfile('sample_file.zip')) # it returns True\n\nif __name__ == '__main__': main()\n
\n
True
\n

Manipuler des fichiers ZIP

\n

Dans cette section, vous allez apprendre à ouvrir, extraire, écrire, etc., des fichiers ZIP.

\n

Extraire un fichier ZIP

\n

Extraction du contenu d’un ZIP vers le répertoire courant à l’aide de la méthode extractall.

\n
## extracting zip file\nimport zipfile\n\ndef main():\n\n    # assigning filename to a variable\n    file_name = 'sample_file.zip'\n\n    # opening Zip using 'with' keyword in read mode\n    with zipfile.ZipFile(file_name, 'r') as file:\n        # printing all the information of archive file contents using 'printdir' method\n        print(file.printdir())\n\n        # extracting the files using 'extracall' method\n        print('Extracting all files...')\n        file.extractall()\n        print('Done!') # check your directory of zip file to see the extracted files\n\nif __name__ == '__main__': main()\n
\n
File Name                                             Modified             Size\nsample_file/                                   2018-10-04 11:33:22            0\nsample_file/even_odd.py                        2018-06-29 23:35:54          129\nsample_file/READ ME.txt                        2018-10-04 11:32:22           59\nNone\nExtracting all files...\nDone!
\n

Extraire un ZIP protégé par mot de passe

\n

Pour extraire un ZIP protégé, vous devez passer une valeur à l’argument pwd des méthodes extract(pwd = password) ou extractall(pwd = password).

\n

Le mot de passe doit être au format bytes. Pour convertir une str en bytes, utilisez la fonction intégrée bytes de Python avec l’encodage utf-8.

\n

Exemple :

\n
## extracting zip with password\nimport zipfile\n\ndef main():\n    file_name = 'pswd_file.zip'\n    pswd = 'datacamp'\n\n    with zipfile.ZipFile(file_name) as file:\n        # password you pass must be in the bytes you converted 'str' into 'bytes'\n        file.extractall(pwd = bytes(pswd, 'utf-8'))\n\nif __name__ == '__main__': main()\n
\n

Vous pouvez aussi extraire les fichiers en utilisant la méthode setpassword(pwd = password) de la classe ZipFile. Exemple :

\n
## extracting zip with password\nimport zipfile\n\n\ndef main():\n    file_name = 'pswd_file.zip'\n    pswd = 'datacamp'\n\n    with zipfile.ZipFile(file_name) as file:\n        # 'setpassword' method is used to give a password to the 'Zip'\n        file.setpassword(pwd = bytes(pswd, 'utf-8'))\n        file.extractall()\n\nif __name__ == '__main__': main()
\n

Créer des fichiers ZIP

\n

Pour créer un fichier ZIP, pas besoin de méthode supplémentaire. Passez simplement le nom au constructeur ZipFile, et l’archive sera créée dans le répertoire courant.

\n

Exemple :

\n
## Creating Zip file\nimport zipfile\n\ndef main():\n\n    archive_name = 'example_file.zip'\n    # below one line of code will create a 'Zip' in the current working directory\n    with zipfile.ZipFile(archive_name, 'w') as file:\n        print(\"{} is created.\".format(archive_name))\n\nif __name__ == '__main__': main()\n
\n
example_file.zip is created.
\n

Écrire dans des fichiers ZIP

\n

Vous devez ouvrir les fichiers ZIP en mode écriture pour ajouter des fichiers à l’archive. Cela remplace tout le contenu existant du ZIP.

\n

Voyons un exemple.

\n
## Writing files to zip\nimport zipfile\n\ndef main():\n\n    file_name = 'sample_file.zip'\n\n    # Opening the 'Zip' in writing mode\n    with zipfile.ZipFile(file_name, 'w') as file:\n        # write mode overrides all the existing files in the 'Zip.'\n        # you have to create the file which you have to write to the 'Zip.'\n        file.write('extra_file.txt')\n        print('File overrides the existing files')\n\n    # opening the 'Zip' in reading mode to check\n    with zipfile.ZipFile(file_name, 'r') as file:\n        print(file.namelist())\n\nif __name__ == '__main__': main()\n
\n
File overrides the existing files\n['extra_file.txt']
\n

Ajouter des fichiers à un ZIP

\n

Ouvrez le ZIP en mode append (a) pour y ajouter des fichiers sans écraser l’existant.

\n

Exemple :

\n
## Appending files to zip\nimport zipfile\n\n\ndef main():\n\n    file_name = 'sample_file.zip'\n\n    # opening the 'Zip' in writing mode\n    with zipfile.ZipFile(file_name, 'a') as file:\n        # append mode adds files to the 'Zip'\n        # you have to create the files which you have to add to the 'Zip'\n        file.write('READ ME.txt')\n        file.write('even_odd.py')\n        print('Files added to the Zip')\n\n    # opening the 'Zip' in reading mode to check\n    with zipfile.ZipFile(file_name, 'r') as file:\n        print(file.namelist())\n\nif __name__ == '__main__': main()\n
\n
Files added to the Zip\n['extra_file.txt', 'READ ME.txt', 'even_odd.py']\n
\n

Jusqu’ici, vous avez appris à manipuler les fichiers ZIP. Vous pouvez désormais ouvrir, écrire, ajouter, extraire, créer, etc. Vous allez maintenant écrire un petit programme.

\n

Voyons cela.

\n

Extraire plusieurs sous-archives ZIP avec mot de passe en utilisant des boucles et zipfile

\n
    \n
  • Vous avez un ZIP qui contient des sous-fichiers ZIP imbriqués. Chacun de ces ZIP a pour mot de passe son propre nom. Le défi consiste à décompresser tous les ZIP jusqu’au dernier niveau.
  • \n
\n

Étapes pour résoudre le problème

\n
    \n
  • Extrayez le fichier parent en utilisant son nom comme mot de passe.
  • \n
\n
    \n
  • Récupérez le nom du premier enfant avec la méthode namelist(). Stockez-le dans une variable.
  • \n
\n
    \n
  • \n

    Faites tourner une boucle à l’infini.

    \n
      \n
    • \n

      Vérifiez si le fichier est un ZIP avec is_zipfile(). Si oui, faites ce qui suit :

      \n
        \n
      • \n

        Ouvrez l’archive en utilisant la variable name.

        \n
      • \n
      • \n

        Récupérez le mot de passe du ZIP à partir de la variable name.

        \n
      • \n
      • \n

        Extrayez le ZIP.

        \n
      • \n
      • \n

        Récupérez et stockez le nom du ZIP suivant dans la variable name.

        \n
      • \n
      \n
    • \n
    • \n

      sinon

      \n
        \n
      • Quittez la boucle avec break.
      • \n
      \n
    • \n
    \n
  • \n
\n

J’ai proposé la procédure ci-dessus. Adaptez-la si besoin selon la structure de vos fichiers.

\n
## Solution\nimport zipfile\n\ndef main():\n\n    # storing the parent name\n    parent_file_name = '000.zip'\n\n    with zipfile.ZipFile(parent_file_name, 'r') as parent_file:\n\n        # extracting the parent file\n        pswd = bytes(parent_file_name.split('.')[0], 'utf-8')\n        parent_file.extractall(pwd = pswd)\n\n        # getting the first child\n        next_zip_name = parent_file.namelist()[0]\n\n        # looping through the sub zips infinite times until you don't encouter a 'Zip' file\n        while True:\n\n            if zipfile.is_zipfile(next_zip_name):\n                # opening the zip\n                with zipfile.ZipFile(next_zip_name, 'r') as child_file:\n\n                    # getting password from the zip name\n                    pswd = bytes(next_zip_name.split('.')[0], 'utf-8')\n\n                    # extracting the zip\n                    child_file.extractall(pwd = pswd)\n\n                    # getting the child zip name\n                    next_zip_name = child_file.namelist()[0]\n            else:\n                break\n\nif __name__ == '__main__': main()\n
\n

Après exécution, vous verrez toutes les sous-archives extraites dans le répertoire courant.

\n

Pour conclure

\n

Félicitations pour avoir terminé ce tutoriel !

\n

Nous espérons qu’il vous a plu. Cet article vous sera très utile lorsque vous travaillerez avec des fichiers ZIP. Vous êtes maintenant en mesure de les manipuler efficacement.

\n

Si vous avez des questions sur l’article, posez-les dans les commentaires. Nous vous répondrons au plus vite.

\n

Encore une fois, si vous débutez avec Python, suivez le cours gratuit de DataCamp Intro to Python for Data Science pour apprendre le langage Python ou lisez la documentation officielle de Python.

\n

Bon code !

Sujets
Python

Cours Python

Cours

Introduction à Python

4 h
7M
Apprenez les bases de l’analyse de données avec Python en quatre heures et explorez ses principaux packages.
Afficher les détailsRight Arrow
Commencer Le Cours
Voir plusRight Arrow