Le module shutil permet de créer et d'extraire facilement des archives en Python. Grâce aux fonctions shutil.make_archive() et shutil.unpack_archive(), il est possible de compresser un dossier dans une archive ZIP, TAR, GZIP, BZIP2 ou XZ, puis d'en extraire automatiquement le contenu. Ces fonctions sont particulièrement pratiques pour créer des sauvegardes, distribuer des projets ou automatiser l'archivage de fichiers.
1. À propos des archives avec shutil
Le module shutil appartient à la bibliothèque standard de Python. Il contient plusieurs fonctions de haut niveau destinées à la manipulation des fichiers, des dossiers et des archives. Il n'est donc pas nécessaire de l'installer avec pip.
Pour travailler avec les archives, deux fonctions sont particulièrement importantes : shutil.make_archive() permet de créer une archive tandis que shutil.unpack_archive() permet d'extraire son contenu.
Avant de commencer, nous devons simplement importer le module shutil.
1 2 | import shutil print("Module shutil chargé") |
Sortie :
1 | Module shutil chargé |
Pourquoi utiliser des archives ?
Une archive permet de regrouper plusieurs fichiers et dossiers dans un seul fichier. Selon le format utilisé, les données peuvent également être compressées afin de réduire l'espace occupé.
Les archives sont notamment utilisées pour créer des sauvegardes, transférer plusieurs fichiers ensemble, distribuer un projet, conserver différentes versions de documents ou préparer des fichiers pour un téléchargement.
2. Créer une archive ZIP avec make_archive()
La fonction shutil.make_archive() permet de créer une archive à partir d'un dossier. Pour créer une archive ZIP, nous indiquons le nom de l'archive, le format "zip" et le dossier à archiver.
Créer une archive ZIP simple
Supposons que nous possédions un dossier nommé mon_projet. Le programme suivant crée une archive projet.zip contenant les éléments présents dans ce dossier.
1 2 3 | import shutil shutil.make_archive("projet", "zip", "mon_projet") print("Archive ZIP créée") |
Sortie :
1 | Archive ZIP créée |
Après l'exécution, Python crée automatiquement le fichier projet.zip. Il n'est pas nécessaire d'ajouter manuellement l'extension .zip au premier argument.
Récupérer le nom de l'archive créée
make_archive() retourne le chemin de l'archive créée. Nous pouvons donc stocker cette valeur dans une variable et l'afficher.
1 2 3 | import shutil archive = shutil.make_archive("sauvegarde", "zip", "mon_projet") print("Archive créée :", archive) |
Sortie possible :
1 | Archive créée : C:\projets\sauvegarde.zip |
Le chemin exact dépend du dossier courant dans lequel le programme Python est exécuté.
Créer une archive dans un autre dossier
Le premier argument de make_archive() peut contenir un chemin. Nous pouvons ainsi choisir l'emplacement dans lequel l'archive doit être créée.
1 2 3 | import shutil shutil.make_archive("archives/backup", "zip", "mon_projet") print("Archive créée dans le dossier archives") |
Sortie :
1 | Archive créée dans le dossier archives |
Le fichier obtenu est archives/backup.zip. Le dossier archives doit exister avant l'exécution de cette instruction.
Créer automatiquement le dossier de sauvegarde
Pour rendre le programme plus robuste, nous pouvons utiliser os.makedirs() afin de créer le dossier de destination s'il n'existe pas encore.
1 2 3 4 5 | import os import shutil os.makedirs("archives", exist_ok=True) shutil.make_archive("archives/backup", "zip", "mon_projet") print("Sauvegarde ZIP créée") |
Sortie :
1 | Sauvegarde ZIP créée |
L'option exist_ok=True évite une erreur lorsque le dossier archives existe déjà.
3. Créer des archives TAR, GZIP, BZIP2 et XZ
shutil.make_archive() n'est pas limitée au format ZIP. Elle prend en charge plusieurs formats d'archives selon les possibilités offertes par l'installation Python et le système utilisé.
Créer une archive TAR
Pour créer une archive TAR non compressée, il suffit de remplacer le format "zip" par "tar".
1 2 3 | import shutil shutil.make_archive("projet", "tar", "mon_projet") print("Archive TAR créée") |
Sortie :
1 | Archive TAR créée |
Python crée alors un fichier nommé projet.tar.
Créer une archive TAR.GZ
Le format gztar permet de créer une archive TAR compressée avec gzip. Le fichier obtenu possède généralement l'extension .tar.gz.
1 2 3 | import shutil shutil.make_archive("projet", "gztar", "mon_projet") print("Archive TAR.GZ créée") |
Sortie :
1 | Archive TAR.GZ créée |
Cette commande génère généralement le fichier projet.tar.gz.
Créer une archive TAR.BZ2
Le format bztar utilise la compression bzip2. Il permet généralement de créer une archive portant l'extension .tar.bz2.
1 2 3 | import shutil shutil.make_archive("projet", "bztar", "mon_projet") print("Archive TAR.BZ2 créée") |
Sortie :
1 | Archive TAR.BZ2 créée |
Le fichier obtenu est généralement nommé projet.tar.bz2.
Créer une archive TAR.XZ
Lorsque le format est disponible, xztar permet d'utiliser la compression XZ pour créer une archive TAR compressée.
1 2 3 | import shutil shutil.make_archive("projet", "xztar", "mon_projet") print("Archive TAR.XZ créée") |
Sortie :
1 | Archive TAR.XZ créée |
Le fichier obtenu est généralement projet.tar.xz.
4. Extraire une archive avec unpack_archive()
La fonction shutil.unpack_archive() réalise l'opération inverse de make_archive(). Elle permet d'extraire le contenu d'une archive dans un dossier donné.
Extraire une archive ZIP
Dans l'exemple suivant, le contenu du fichier projet.zip est extrait dans le dossier projet_extrait.
1 2 3 | import shutil shutil.unpack_archive("projet.zip", "projet_extrait") print("Archive ZIP extraite") |
Sortie :
1 | Archive ZIP extraite |
Python détecte généralement le format de l'archive grâce à son extension et extrait automatiquement les fichiers et les dossiers qu'elle contient.
Extraire une archive TAR
La même fonction peut être utilisée pour extraire une archive TAR. Nous indiquons simplement le fichier d'archive et le dossier de destination.
1 2 3 | import shutil shutil.unpack_archive("projet.tar", "projet_tar") print("Archive TAR extraite") |
Sortie :
1 | Archive TAR extraite |
Le contenu de projet.tar est placé dans le dossier projet_tar.
Extraire une archive TAR.GZ
unpack_archive() peut également extraire les archives TAR compressées comme les fichiers .tar.gz.
1 2 3 | import shutil shutil.unpack_archive("projet.tar.gz", "projet_gzip") print("Archive TAR.GZ extraite") |
Sortie :
1 | Archive TAR.GZ extraite |
Il n'est généralement pas nécessaire de décompresser séparément le fichier GZIP puis d'extraire le TAR : unpack_archive() effectue l'opération directement.
Préciser explicitement le format
Lorsque Python ne peut pas déterminer automatiquement le format ou lorsque nous souhaitons le préciser explicitement, nous pouvons utiliser le paramètre format.
1 2 3 | import shutil shutil.unpack_archive("sauvegarde.zip", "restauration", format="zip") print("Extraction terminée") |
Sortie :
1 | Extraction terminée |
Le paramètre format="zip" indique explicitement que le fichier doit être traité comme une archive ZIP.
5. Connaître les formats d'archives disponibles
Le module shutil permet de connaître les formats disponibles pour la création et l'extraction d'archives. Cette possibilité est utile lorsque nous voulons écrire un programme compatible avec différents environnements.
Afficher les formats de création disponibles
La fonction shutil.get_archive_formats() retourne la liste des formats que make_archive() peut utiliser pour créer des archives.
1 2 3 4 | import shutil formats = shutil.get_archive_formats() for format_archive in formats: print(format_archive) |
Sortie possible :
1 2 3 4 5 | ('bztar', "bzip2'ed tar-file") ('gztar', "gzip'ed tar-file") ('tar', 'uncompressed tar file') ('xztar', "xz'ed tar-file") ('zip', 'ZIP file') |
La liste exacte peut dépendre de la version de Python et des fonctionnalités disponibles sur le système.
Afficher les formats d'extraction disponibles
La fonction shutil.get_unpack_formats() retourne les formats que unpack_archive() sait extraire.
1 2 3 4 | import shutil formats = shutil.get_unpack_formats() for format_archive in formats: print(format_archive) |
Sortie possible :
1 2 3 4 5 | ('bztar', ['.tar.bz2', '.tbz2'], "bzip2'ed tar-file") ('gztar', ['.tar.gz', '.tgz'], "gzip'ed tar-file") ('tar', ['.tar'], 'uncompressed tar file') ('xztar', ['.tar.xz', '.txz'], "xz'ed tar-file") ('zip', ['.zip'], 'ZIP file') |
Chaque élément fournit notamment le nom du format, les extensions correspondantes et une description.
6. Gérer les erreurs lors de l'archivage et de l'extraction
La création ou l'extraction d'une archive peut échouer lorsque le dossier source n'existe pas, lorsque l'archive est introuvable, lorsque le format n'est pas reconnu ou lorsque l'utilisateur ne possède pas les permissions nécessaires.
Vérifier que le dossier à archiver existe
Avant de créer une archive, nous pouvons vérifier avec os.path.isdir() que le dossier source existe réellement.
1 2 3 4 5 6 7 8 | import os import shutil source = "mon_projet" if os.path.isdir(source): shutil.make_archive("backup", "zip", source) print("Archive créée") else: print("Le dossier source n'existe pas") |
Sortie possible :
1 | Archive créée |
Cette vérification permet d'éviter de lancer une opération d'archivage sur un chemin incorrect.
Vérifier qu'une archive existe avant de l'extraire
De la même manière, il est préférable de vérifier l'existence du fichier d'archive avant de demander son extraction.
1 2 3 4 5 6 7 8 | import os import shutil archive = "backup.zip" if os.path.isfile(archive): shutil.unpack_archive(archive, "restauration") print("Archive extraite") else: print("Archive introuvable") |
Sortie possible :
1 | Archive extraite |
La fonction os.path.isfile() permet ici de vérifier que le chemin correspond à un fichier existant.
Utiliser try et except
Pour gérer plusieurs erreurs possibles, nous pouvons placer l'opération dans un bloc try...except. L'exemple suivant traite notamment l'absence de l'archive, les problèmes de permissions et certaines erreurs liées au format.
1 2 3 4 5 6 7 8 9 10 | import shutil try: shutil.unpack_archive("backup.zip", "restauration") print("Extraction réussie") except FileNotFoundError: print("Archive introuvable") except PermissionError: print("Permission refusée") except (shutil.ReadError, ValueError) as erreur: print("Archive ou format non valide :", erreur) |
Sortie possible :
1 | Extraction réussie |
La gestion des exceptions permet de rendre le programme plus robuste et d'afficher un message compréhensible lorsqu'une opération échoue.
Précaution lors de l'extraction
L'extraction d'une archive provenant d'une source inconnue ou non fiable doit être réalisée avec prudence. Une archive peut contenir des chemins ou des fichiers inattendus. Pour les archives externes, il est recommandé d'utiliser une version récente de Python et les mécanismes de filtrage ou de validation disponibles pour le format concerné.
7. Exemples pratiques et points importants
Créer une sauvegarde ZIP d'un projet
Une utilisation fréquente de make_archive() consiste à créer une sauvegarde ZIP d'un projet. L'exemple suivant crée automatiquement le dossier destiné aux sauvegardes puis génère l'archive.
1 2 3 4 5 6 7 8 9 10 | import os import shutil source = "mon_projet" os.makedirs("sauvegardes", exist_ok=True) archive = shutil.make_archive( "sauvegardes/mon_projet_backup", "zip", source ) print("Sauvegarde créée :", archive) |
Sortie possible :
1 | Sauvegarde créée : C:\projets\sauvegardes\mon_projet_backup.zip |
Cette technique peut facilement être intégrée dans un script de sauvegarde automatique.
Ajouter la date au nom de la sauvegarde
Pour conserver plusieurs versions d'un projet, nous pouvons ajouter la date au nom de l'archive. Le module datetime permet de générer automatiquement cette information.
1 2 3 4 5 6 | import shutil from datetime import datetime date = datetime.now().strftime("%Y-%m-%d") nom = "backup_" + date archive = shutil.make_archive(nom, "zip", "mon_projet") print("Archive créée :", archive) |
Sortie possible :
1 | Archive créée : C:\projets\backup_2026-09-25.zip |
Une nouvelle archive portant la date courante peut ainsi être créée à chaque sauvegarde.
Créer puis extraire une archive
Nous pouvons naturellement combiner make_archive() et unpack_archive(). L'exemple suivant crée d'abord une archive ZIP puis l'extrait dans un autre dossier.
1 2 3 4 5 | import shutil archive = shutil.make_archive("backup", "zip", "mon_projet") print("Archive créée :", archive) shutil.unpack_archive(archive, "restauration") print("Archive extraite dans restauration") |
Sortie possible :
1 2 | Archive créée : C:\projets\backup.zip Archive extraite dans restauration |
Ce principe peut être utilisé pour mettre en place un système simple de sauvegarde et de restauration.
Points importants à retenir
shutil.make_archive() permet de créer facilement des archives à partir d'un dossier.
shutil.unpack_archive() permet d'extraire une archive vers un dossier de destination.
Le format zip crée une archive ZIP, tar une archive TAR, gztar une archive TAR.GZ, bztar une archive TAR.BZ2 et xztar une archive TAR.XZ lorsque ces formats sont disponibles.
shutil.get_archive_formats() permet de connaître les formats utilisables pour créer des archives et shutil.get_unpack_formats() indique ceux disponibles pour l'extraction.
Pour une application importante, il est conseillé de vérifier l'existence des fichiers et dossiers et de prévoir une gestion des exceptions.
Conclusion
Le module shutil permet de gérer simplement les opérations courantes d'archivage en Python. Avec seulement quelques instructions, nous pouvons créer des archives ZIP ou TAR, compresser un projet, extraire une sauvegarde et automatiser la conservation de plusieurs versions.
Les fonctions make_archive() et unpack_archive() sont particulièrement adaptées aux scripts de sauvegarde, de restauration, de distribution de projets ou d'automatisation des fichiers.
Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/


