In diesem Artikel werden wir besprechen, wie man ein Zip-Archiv aus ausgewählten Dateien oder Dateien aus einem Verzeichnis auf der Grundlage von Filtern erstellt.
Das zipfile-Modul von Python bietet eine ZipFile-Klasse für zip-Datei-bezogene Dinge. Lassen Sie uns diese verwenden, um eine Zip-Archivdatei zu erstellen.
Erst importieren Sie die Klasse aus dem Modul, d.h.
from zipfile import ZipFile
Erstellen Sie ein Zip-Archiv aus mehreren Dateien in Python
Die Schritte sind,
- Erstellen Sie ein ZipFile-Objekt, indem Sie den neuen Dateinamen und den Modus als ‚w‘ (Schreibmodus) übergeben. Es wird eine neue Zip-Datei erstellt und innerhalb des ZipFile-Objekts geöffnet.
- Aufruf der Funktion write() für das ZipFile-Objekt, um die Dateien hinzuzufügen.
- Aufruf der Funktion close() für das ZipFile-Objekt, um die Zip-Datei zu schließen.
Es wird eine Zip-Datei ’sample.zip‘ mit den angegebenen Dateien darin erstellt.
Wir können dasselbe mit „with open“ tun. Die Zip-Datei wird automatisch geschlossen, wenn das ZipFile-Objekt den Gültigkeitsbereich verläßt, d.h.
Erstellen eines Zip-Archivs eines Verzeichnisses
Um den gesamten Inhalt eines Verzeichnisses in ein Zip-Archiv zu packen, müssen wir alle Dateien im Verzeichnis und seinen Unterverzeichnissen durchlaufen und dann jeden Eintrag mit 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))
Damit wird der gesamte Inhalt eines Verzeichnisses in eine einzige Zip-Datei gepackt, z. B. ’sampleDir.zip‘. Sein Inhalt wird sein,
Ausgewählte Dateien aus einem Verzeichnis auf der Grundlage von Filtern oder Platzhaltern zippen
Um ausgewählte Dateien aus einem Verzeichnis zu zippen, müssen wir die Bedingung für jeden Dateipfad während der Iteration überprüfen, bevor wir ihn zur Zip-Datei hinzufügen.
Lassen Sie uns eine Funktion erstellen, die über ein Verzeichnis iteriert und den Inhalt mit einem gegebenen Rückruf filtert. Dateien, die den Filter passieren, werden nur in die Zip-Datei aufgenommen.
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))
Lassen Sie uns nur Csv-Dateien aus einem Verzeichnis zippen, d.h. eine Lambda-Funktion als Argument übergeben.
zipFilesInDir('sampleDir', 'sampleDir2.zip', lambda name : 'csv' in name)
Es wird ein Zip-Archiv ’sampleDir2.zip‘ mit allen Csv-Dateien aus dem angegebenen Verzeichnis erstellt.
Das vollständige Beispiel lautet wie folgt: