Créer et extraire des archives ZIP et TAR avec shutil en Python

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.

Sortie :

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.

Sortie :

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.

Sortie possible :

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.

Sortie :

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.

Sortie :

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".

Sortie :

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.

Sortie :

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.

Sortie :

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.

Sortie :

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.

Sortie :

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.

Sortie :

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.

Sortie :

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.

Sortie :

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.

Sortie possible :

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.

Sortie possible :

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.

Sortie possible :

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.

Sortie possible :

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.

Sortie possible :

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.

Sortie possible :

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.

Sortie possible :

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.

Sortie possible :

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/


Leave a Reply

Your email address will not be published. Required fields are marked *