zipfile pour compresser et décompresser les fichiers ZIP en Python

Affaires

Le module zipfile de la bibliothèque standard Python peut être utilisé pour compresser des fichiers en ZIP et décompresser des fichiers ZIP. Il est inclus dans la bibliothèque standard, aucune installation supplémentaire n'est donc nécessaire.

Les contenus suivants sont expliqués.

  • Compresser plusieurs fichiers dans un fichier ZIP
  • Ajouter un nouveau fichier à un fichier ZIP existant
  • Compresser un répertoire (dossier) en un fichier ZIP
  • Compressé dans un fichier ZIP avec un mot de passe
  • Vérifiez le contenu du fichier ZIP.
  • Extraire (décompresser) l'ensemble du contenu du fichier ZIP.
  • Sélectionnez le contenu du fichier ZIP et extrayez-le.

Compresser plusieurs fichiers dans un fichier ZIP

Créez un objet ZipFile et utilisez la méthode write() pour ajouter les fichiers que vous souhaitez compresser.

Pour créer un nouveau fichier ZIP, spécifiez le chemin du fichier ZIP à créer comme premier argument du constructeur de l'objet ZipFile, et le second argument comme suit'w'

En outre, la méthode de compression peut être spécifiée comme troisième argument.

  • zipfile.ZIP_STORED:Combine simplement plusieurs fichiers sans compression (par défaut)
  • zipfile.ZIP_DEFLATED:Compression ZIP normale (module zlib requis)
  • zipfile.ZIP_BZIP2:Compression BZIP2 (module bz2 requis)
  • zipfile.ZIP_LZMA:Compression LZMA (module lzma requis)

BZIP2 et LZMA ont un taux de compression plus élevé (peuvent être comprimés à une taille plus petite), mais le temps nécessaire à la compression est plus long.

Dans la méthode write(), le fichier dont le nom de fichier est le premier argument est écrit dans un fichier ZIP dont le nom d'arc est le deuxième argument. Si arcname est omis, filename est utilisé tel quel. arcname peut également spécifier une structure de répertoire.

L'objet ZipFile doit être fermé avec la méthode close(), mais si vous utilisez l'instruction with, il sera fermé automatiquement à la fin du bloc.

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

En spécifiant l'argument compress_type de la méthode write(), il est également possible de sélectionner la méthode de compression pour chaque fichier.

with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

Ajouter un nouveau fichier à un fichier ZIP existant

Pour ajouter un nouveau fichier à un fichier zip existant, définissez le premier argument du constructeur comme étant le chemin du fichier zip existant lors de la création de l'objet ZipFile. Définissez également le mode du deuxième argument comme suit.'a'

Ensuite, comme dans l'exemple ci-dessus, il suffit d'ajouter le fichier en utilisant la méthode write().

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

Compresser un répertoire (dossier) en un fichier ZIP

Si vous voulez compresser un répertoire entier (dossier) en un seul fichier ZIP, vous pouvez utiliser os.scandir() ou os.listdir() pour faire une liste de fichiers, mais il est plus facile d'utiliser make_archive() dans le module shutil.

Voir l'article suivant.

Compressé dans un fichier ZIP avec un mot de passe

Le module zipfile ne vous permet pas de créer des ZIP protégés par un mot de passe. Si vous souhaitez compresser un fichier dans un fichier zip protégé par un mot de passe, utilisez la bibliothèque tierce pyminizip.

Notez que la décompression des ZIP protégés par un mot de passe peut être effectuée avec le module zipfile (voir ci-dessous).

Vérifiez le contenu du fichier ZIP.

Vous pouvez vérifier le contenu d'un fichier ZIP existant.

Crée un objet ZipFile en définissant le premier argument file du constructeur comme étant le chemin du fichier zip existant et le second argument mode comme étant 'r'. L'argument mode peut être omis car la valeur par défaut est 'r'.

Vous pouvez utiliser la méthode namelist() de l'objet ZipFile pour obtenir une liste des fichiers archivés.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']

Extraire (décompresser) l'ensemble du contenu du fichier ZIP.

Pour décompresser le contenu d'un fichier ZIP, créez un objet ZipFile avec comme premier argument file dans le constructeur le chemin du fichier ZIP existant et comme deuxième argument mode 'r', comme dans l'exemple ci-dessus. L'argument mode peut être omis car il prend la valeur 'r' par défaut.

La méthode extractall() de l'objet ZipFile extrait (décompresse) l'intégralité du contenu du fichier ZIP. Le premier argument, path, indique le chemin du répertoire vers lequel l'extraction doit être effectuée. S'il est omis, les fichiers seront extraits dans le répertoire courant.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extractall('data/temp/ext')

Un fichier ZIP avec un mot de passe peut être extrait en spécifiant le mot de passe comme argument pwd de la méthode extractall().

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extractall('data/temp/ext_pass', pwd='password')

Sélectionnez le contenu du fichier ZIP et extrayez-le.

Si vous souhaitez décompresser et extraire uniquement certains fichiers, utilisez la méthode extract().

Le premier argument de la méthode extract() est le nom du fichier à extraire, et le second argument path est le chemin du répertoire vers lequel l'extraction doit être effectuée. Si l'argument path est omis, le fichier sera extrait dans le répertoire actuel. Le nom du fichier à extraire doit inclure le chemin du répertoire dans le fichier ZIP s'il y est stocké.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

Comme la méthode extractall(), la méthode extract() vous permet également de spécifier un mot de passe comme argument pwd.

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')
Copied title and URL