Manipulation des archives ZIP en Python avec le module zipfile

Le module zipfile est l'outil standard de la bibliothèque Python pour manipuler des fichiers au format ZIP. Il permet de lire, créer, extraire et gérer les métadonnées des archives de manière efficace. Les deux classes fondamentales à maîtriser sont ZipFile, qui gère l'archive elle-même, et ZipInfo, qui contient les informations détaillées de chaque fichier compressé.

Utilisation de la classe ZipFile

La classe zipfile.ZipFile est le point d'entrée principal. Elle accepte plusieurs paramètres, notammnet le chemin du fichier, le mode d'ouverture et le type de compression.

  • Mode 'r' : Lecture d'une archive existante (par défaut).
  • Mode 'w' : Création d'une nouvelle archive (écrase le fichier s'il existe).
  • Mode 'a' : Ajout de données à une archive existante.

Pour gérer des fichiers dépassant 2 Go, il est nécessaire d'activer l'option allowZip64=True.

Lister le contenu d'une archive

La méthode namelist() retourne la liste des noms de fichiers présents dans le conteneur.

import zipfile

# Ouverture sécurisée avec un gestionnaire de contexte
with zipfile.ZipFile('archive_exemple.zip', 'r') as archive:
    # Récupération de la liste des noms
    contenu = archive.namelist()
    for nom_fichier in contenu:
        print(f"Élément présent : {nom_fichier}")

Extraction de fichiers

Il existe deux méthodes pour extraire des données : extract() pour un fichier spécifique et extractall() pour l'intégralité de l'archvie.

import zipfile
import os

chemin_zip = "donnees.zip"
repertoire_cible = "extraction_output"

with zipfile.ZipFile(chemin_zip, 'r') as mon_zip:
    # Extraction complète dans un dossier spécifique
    mon_zip.extractall(path=repertoire_cible)
    
    # Extraction d'un seul fichier spécifique
    # mon_zip.extract('note.txt', path=repertoire_cible)

Création et ajout de fichiers

Pour compresser un fichier, on utilise la méthode write(). Le paramètre compress_type est crucial pour définir si les données doivent être réellement compressées (ZIP_DEFLATED) ou simplement stockées (ZIP_STORED).

import zipfile

fichiers_a_ajouter = ['image.png', 'script.py']

with zipfile.ZipFile('export.zip', 'w', compression=zipfile.ZIP_DEFLATED) as zip_output:
    for fichier in fichiers_a_ajouter:
        # On peut spécifier un nom différent dans l'archive via arcname
        zip_output.write(fichier, arcname=f"backup/{fichier}")

Métadonnées avec la classe ZipInfo

Chaque fichier au sein d'un ZIP possède un objet ZipInfo associé. Cet objet contient des détails techniques tels que la taille originale, la taille compressée ou la date de modification.

Voici les attributs les plus couramment utilisés :

  • filename : Le nom du fichier.
  • date_time : Un tuple (année, mois, jour, heure, minute, seconde).
  • compress_size : Taille après compression.
  • file_size : Taille réelle avant compression.
  • CRC : Code de vérification d'intégrité (Cyclic Redundancy Check).

Exemple d'inspection des métadonnées

import zipfile

with zipfile.ZipFile('projet.zip', 'r') as z:
    # Récupération des informations pour un fichier précis
    infos = z.getinfo('main.py')
    
    print(f"Nom : {infos.filename}")
    print(f"Taille d'origine : {infos.file_size} octets")
    print(f"Taille compressée : {infos.compress_size} octets")
    print(f"Dernière modification : {infos.date_time}")
    
    # On peut aussi obtenir la liste complète via infolist()
    toutes_les_infos = z.infolist()
    total_non_compresse = sum(f.file_size for f in toutes_les_infos)
    print(f"Poids total décompressé : {total_non_compresse}")

Opérations avancées

Le module permet également de manipuler les données directement en mémoire sans passer par des fichiers temporaires sur le disque grâce à read() et writestr().

import zipfile

with zipfile.ZipFile('memoire.zip', 'w') as z:
    # Écriture directe d'une chaîne de caractères ou de bytes
    message = "Ceci est un contenu généré dynamiquement"
    z.writestr('info.txt', message)

with zipfile.ZipFile('memoire.zip', 'r') as z:
    # Lecture directe du contenu binaire
    donnees_binaires = z.read('info.txt')
    print(donnees_binaires.decode('utf-8'))

Étiquettes: Python zipfile compression archives file-handling

Publié le 9 juillet à 03h07