Zip-Archiv erstellen

Pythons zipfile-Modul bietet eine ZipFile-Klasse an, die man verwenden kann, um eine Zip-Archivdatei zu erstellen.
Dazu ist folgender Import notwendig:
import zipfile

Erstellen eines Zip-Archivs aus mehreren Dateien

Man erstellt ein ZipFile-Objekt, und übergibt dabei den Dateinamen sowie den Modus ‚w‘ (Schreibmodus). Es wird eine neue Zip-Datei erstellt und das ZipFile-Objekt geöffnet.
Man ruft die Funktion write() auf dem ZipFile-Objekt auf, um die Dateien darin hinzuzufügen.
Am Ende ruft man die Funktion close() auf, um die Zip-Datei ordnungsgemäß zu schließen.

import zipfile

# ZipFile-Objekt erstellen
zipObj = zipfile.ZipFile('sample.zip', 'w')
# einzelne Dateien dem Archiv hinzufügen
zipObj.write('sample_file.csv')
zipObj.write('test_1.log')
zipObj.write('test_2.log')
# ZipFile-Objekt schliessen
zipObj.close()

Man sollte besser ein with open verwenden, welches automatisch zu einem close führt am Ende der Verarbeitung. Damit wird der Code lesbarer und bei Bedarf pflegbarer.

# ZipFile-Objekt erstellen
with zipfile.ZipFile('sample2.zip', 'w') as zipObj2:
   # einzelne Dateien dem Archiv hinzufügen
   zipObj2.write('sample_file.csv')
   zipObj2.write('test_1.log')
   zipObj2.write('test_2.log')

Inhalt des Zip-Archivs komprimieren

Das ZipFile-Objekt verlangt die Angabe der Komprimierungsmethode. Wenn man nichts angibt, wird die Komprimierungsmethode zipfile.ZIP_STORED standardmäßig angenommen. Diese Methode speichert nur die Dateien, ohne sie zu komprimieren! Man muss die Methode als zipfile.ZIP_DEFLATED angeben. Hierfür muss das Modul zlib installiert sein (normalerweise ist es standardmäßig installiert).
Die verfügbaren Optionen sind ZIP_DEFLATED, ZIP_BZIP2 oder ZIP_LZMA, die entsprechenden Bibliotheken zlib, bz2 oder lzma sind ggfs. zu installieren.
Weitere Informationen findet man in der Python-Dokumentation.

Ein komprimiertes zip-Archiv erhält man somit mit folgendem Aufruf:

import zipfile
with zipfile.ZipFile('sample2.zip', 'w', zipfile.ZIP_DEFLATED) as zipObj2:
   zipObj2.write('sample_file.csv')

Zip-Archiv eines Verzeichnisses erstellen

Um den gesamten Inhalt eines Verzeichnisses in ein Zip-Archiv zu packen, müssen alle Dateien im Verzeichnis und seinen Unterverzeichnissen durchlaufen und dann jeder Eintrag mit ZipFile.write() in die Zip-Datei eingefügt werden.

import zipfile
import os
from os.path import basename

with zipfile.ZipFile('sampleDir.zip', 'w', zipfile.ZIP_DEFLATED) as zipObj:
   
   for folderName, subfolders, filenames in os.walk(dirName):
       for filename in filenames:
           # der komplette Pfad zur Datei wird erstellt
           filePath = os.path.join(folderName, filename)
           zipObj.write(filePath, basename(filePath))

Anstatt mit os.walk kann die Funktion auch mit Path realisiert werden.

with zipfile.ZipFile(pathlib.Path(dirname / zip_filename), 'w', zipfile.ZIP_DEFLATED) as zipfile:
    walk_path = pathlib.Path(dirname)
    for entry in walk_path.glob('**/*'):
        zipfile.write(entry, entry.name)

Ausgewählte Dateien aus einem Verzeichnis anhand von Filtern oder Wildcards zippen

Um ausgewählte Dateien aus einem Verzeichnis zu zippen, muss man die Bedingung für jeden Dateipfad während der Iteration prüfen, bevor man ihn zur Zip-Datei hinzufügt. Nur Dateien, die den Filter bestehen, werden in die Zip-Datei aufgenommen, z.B.

import zipfile
import os
from os.path import basename
# Zip alle Datein aus einem Verzeichnis, die zum Filter passen
def zipFilesInDir(dirName, zipFileName, filter):

   with zipfile.ZipFile(zipFileName, 'w', zipfile.ZIP_DEFLATED) as zipObj:
       for folderName, subfolders, filenames in os.walk(dirName):
           for filename in filenames:
               if filter(filename):
                   filePath = os.path.join(folderName, filename)
                   zipObj.write(filePath, basename(filePath))

Um z.B. nur csv-Dateien aus einem Verzeichnis zu zippen, kann man eine Lambda-Funktion als Argument übergeben.
Beispiel für einen Aufruf der Funktion:
zipFilesInDir('sampleDir', 'sampleDir2.zip', lambda name : 'csv' in name)