zipfile est un module de la bibliothèque standard de Python. Il fournit des outils simples pour créer, lire, écrire, ajouter et extraire des fichiers d'archives ZIP. Ce tutoriel explore ses fonctionnalités essentielles.
1. A propos de zipfile — Travailler avec les archives ZIP
Le module zipfile permet de gérer le format d'archive ZIP, un format courant de compression et d'archivage sans perte. Il est capable de gérer les fichiers chiffrés (avec certains algorithmes) et les archives fragmentées. Il offre deux classes principales : ZipFile pour lire et écrire des archives, et ZipInfo pour les informations sur un membre de l'archive.
1.1 Création d'une archive zip à partir des fichiers existants
Le module zipfile permet de créer une archive .zip facilement à l'aide de la classe ZipFile. Il suffit d'importer le module et faire une instanciation sur cette dernière:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import zipfile import os # Étape 1: Création de trois fichiers texte # ----------------------------------------- # Création du premier fichier with open('file1.txt', 'w', encoding='utf-8') as f: f.write("Ceci est le contenu du premier fichier") # Création du deuxième fichier with open('file2.txt', 'w', encoding='utf-8') as f: f.write("Ceci est le contenu du deuxième fichier") # Création du troisième fichier with open('file3.txt', 'w', encoding='utf-8') as f: f.write("Ceci est le contenu du troizième fichier") # Étape 2: Création de l'archive ZIP à partir des trois fichiers # --------------------------------------------------------------- # Nom de l'archive à créer my_archive = 'archive.zip' # Création de l'archive ZIP en mode écriture ('w') with zipfile.ZipFile(my_archive, 'w') as zipf: # Ajout de chaque fichier à l'archive zipf.write('file1.txt') zipf.write('file2.txt') zipf.write('file3.txt') # On peut aussi ajouter des commentaires ou spécifier un niveau de compression # zipf.write('document1.txt', compress_type=zipfile.ZIP_DEFLATED) print(f"Archive '{my_archive}' créée avec les trois fichiers!") |
1.2 Ouverture et lecture basique d'une archive existante
Pour examiner le contenu d'une archive ZIP, on utilise la classe ZipFile en mode lecture ('r'). La méthode namelist() retourne la liste de tous les fichiers et dossiers contenus.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import zipfile # Exemple avec une archive que nous allons créer pour la démonstration # (si le fichier n'existe pas, ce code ne plantera pas, mais affichera une erreur) try: with zipfile.ZipFile('exemple_archive.zip', 'r') as z: print("Contenu de l'archive :") for nom_fichier in z.namelist(): print(f" - {nom_fichier}") except FileNotFoundError: print("L'archive 'exemple_archive.zip' n'existe pas encore. Nous allons en créer une plus tard.") # Output (si l'archive existe) : Liste des fichiers # Output (si elle n'existe pas) : L'archive 'exemple_archive.zip' n'existe pas encore. |
2. Créer et ajouter des fichiers à une archive
On peut créer une nouvelle archive en utilisant le mode 'w' (write). Attention, ce mode écrase l'archive si elle existe déjà. La méthode write() permet d'ajouter un fichier du système de fichiers à l'archive.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import zipfile import os # Création de fichiers factices pour l'exemple with open('fichier1.txt', 'w') as f: f.write("Ceci est le contenu du premier fichier.") with open('fichier2.txt', 'w') as f: f.write("Ceci est le contenu du second fichier.") # Création de l'archive et ajout des fichiers with zipfile.ZipFile('exemple_archive.zip', 'w') as z: z.write('fichier1.txt') z.write('fichier2.txt') print("Fichiers ajoutés à l'archive 'exemple_archive.zip'.") # Vérifions le contenu with zipfile.ZipFile('exemple_archive.zip', 'r') as z: print("Contenu après création :", z.namelist()) # Nettoyage des fichiers factices (optionnel) # os.remove('fichier1.txt') # os.remove('fichier2.txt') # Output: # Fichiers ajoutés à l'archive 'exemple_archive.zip'. # Contenu après création : ['fichier1.txt', 'fichier2.txt'] |
3. Extraire des fichiers d'une archive
L'extraction peut se faire de deux manières : extract() pour un fichier spécifique, ou extractall() pour tous les fichiers. Il est possible de spécifier un dossier de destination avec le paramètre path.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import zipfile import os # On s'assure que l'archive de la section précédente existe with zipfile.ZipFile('exemple_archive.zip', 'r') as z: # Extraction d'un seul fichier z.extract('fichier1.txt', path='extraction_unique') print("Fichier 'fichier1.txt' extrait dans le dossier 'extraction_unique'.") # Extraction de tous les fichiers dans un dossier spécifique z.extractall(path='extraction_totale') print("Tous les fichiers extraits dans le dossier 'extraction_totale'.") # Vérification rapide if os.path.exists('extraction_unique/fichier1.txt'): print("Extraction unique réussie.") if os.path.exists('extraction_totale/fichier2.txt'): print("Extraction totale réussie.") # Output: # Fichier 'fichier1.txt' extrait dans le dossier 'extraction_unique'. # Tous les fichiers extraits dans le dossier 'extraction_totale'. # Extraction unique réussie. # Extraction totale réussie. |
4. Lire et écrire des données en mémoire
Il n'est pas toujours nécessaire d'écrire sur le disque pour interagir avec une archive. La méthode read() retourne les données d'un fichier sous forme de bytes. Inversement, on peut écrire des données directement dans l'archive avec writestr() sans passer par un fichier temporaire sur le disque.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import zipfile # Écriture d'une chaîne de caractères directement dans l'archive with zipfile.ZipFile('archive_memoire.zip', 'w') as z: # writestr(nom_dans_archive, donnees_bytes_ou_str) z.writestr('note.txt', 'Ce texte est créé en mémoire.') z.writestr('donnees.txt', '12345 67890') print("Fichiers créés en mémoire et ajoutés à l'archive.") # Lecture d'un fichier spécifique depuis l'archive sans l'extraire with zipfile.ZipFile('archive_memoire.zip', 'r') as z: contenu = z.read('note.txt') print("Contenu de 'note.txt' lu depuis l'archive :") print(contenu.decode('utf-8')) # decode pour afficher en str # Output: # Fichiers créés en mémoire et ajoutés à l'archive. # Contenu de 'note.txt' lu depuis l'archive : # Ce texte est créé en mémoire. |
5. Informations sur les membres et gestion des contextes
Chaque membre d'une archive peut être décrit par un objet ZipInfo, accessible via la méthode getinfo() ou l'attribut infolist(). Cela donne des détails comme la taille, la date de modification, le taux de compression, etc. L'utilisation du mot-clé with (gestionnaire de contexte) est recommandée pour garantir la fermeture correcte de l'archive.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import zipfile import datetime with zipfile.ZipFile('exemple_archive.zip', 'r') as z: # Obtenir les informations de tous les membres for info in z.infolist(): print(f"Fichier : {info.filename}") print(f" Taille originale : {info.file_size} octets") print(f" Taille compressée : {info.compress_size} octets") # La date est stockée sous forme d'un tuple (annee, mois, jour, heure, minute, seconde) date_modif = datetime.datetime(*info.date_time) print(f" Dernière modification : {date_modif}") if info.file_size > 0: ratio = (1 - info.compress_size / info.file_size) * 100 print(f" Taux de compression : {ratio:.1f}%") print("-" * 20) # Output (les valeurs exactes dépendent des fichiers et de l'horodatage) : # Fichier : fichier1.txt # Taille originale : 44 octets # Taille compressée : 46 octets # Dernière modification : ... # Taux de compression : -4.5% (car très petits fichiers) # -------------------- # Fichier : fichier2.txt # ... |
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/



