Dans cet article, nous allons discuter de la façon de créer une archive zip à partir de fichiers sélectionnés ou de fichiers d’un répertoire basé sur des filtres.
Le module zipfile de Python fournit une classe ZipFile pour les trucs liés aux fichiers zip. Utilisons-la pour créer un fichier d’archive zip.
Premièrement, importez la classe du module c’est-à-dire
from zipfile import ZipFile
Créer une archive zip à partir de plusieurs fichiers en Python
Les étapes sont,
- Créer un objet ZipFile en passant le nouveau nom de fichier et le mode comme ‘w’ (mode d’écriture). Il créera un nouveau fichier zip et l’ouvrira dans l’objet ZipFile.
- Appeler la fonction write() sur l’objet ZipFile pour y ajouter les fichiers.
- appeler close() sur l’objet ZipFile pour fermer le fichier zip.
Il créera un fichier zip ‘sample.zip’ avec des fichiers donnés à l’intérieur.
Nous pouvons faire la même chose avec « with open » . Il fermera automatiquement le fichier zip lorsque l’objet ZipFile sortira de sa portée c’est-à-dire.
Créer une archive zip d’un répertoire
Pour compresser tout le contenu d’un répertoire dans une archive zip, nous devons itérer sur tous les fichiers du répertoire et de ses sous-répertoires, puis ajouter chaque entrée au fichier zip en utilisant ZipFile.write()
from zipfile import ZipFileimport osfrom os.path import basename# create a ZipFile objectwith ZipFile('sampleDir.zip', 'w') as zipObj: # Iterate over all the files in directory for folderName, subfolders, filenames in os.walk(dirName): for filename in filenames: #create complete filepath of file in directory filePath = os.path.join(folderName, filename) # Add file to zip zipObj.write(filePath, basename(filePath))
Il va zipper tout le contenu d’un répertoire dans un seul fichier zip i..e ‘sampleDir.zip’. Son contenu sera,
Zip les fichiers sélectionnés à partir d’un répertoire basé sur un filtre ou des caractères génériques
Pour zipper les fichiers sélectionnés à partir d’un répertoire, nous devons vérifier la condition sur chaque chemin de fichier pendant l’itération avant de l’ajouter au fichier zip.
Créons une fonction qui Itère sur un répertoire et filtre le contenu avec un callback donné. Les fichiers qui passent le filtre seront seulement ajoutés dans le zip, c’est-à-dire
from zipfile import ZipFileimport osfrom os.path import basename# Zip the files from given directory that matches the filterdef zipFilesInDir(dirName, zipFileName, filter): # create a ZipFile object with ZipFile(zipFileName, 'w') as zipObj: # Iterate over all the files in directory for folderName, subfolders, filenames in os.walk(dirName): for filename in filenames: if filter(filename): # create complete filepath of file in directory filePath = os.path.join(folderName, filename) # Add file to zip zipObj.write(filePath, basename(filePath))
Zipons seulement les fichiers csv d’un répertoire, c’est-à-dire passons une fonction lambda comme argument dans celui-ci.
zipFilesInDir('sampleDir', 'sampleDir2.zip', lambda name : 'csv' in name)
Il créera une archive zip ‘sampleDir2.zip’ avec tous les fichiers csv du répertoire donné.
L’exemple complet est le suivant:
.