zipfile zum Komprimieren und Dekomprimieren von ZIP-Dateien in Python

Geschäft

Das zipfile-Modul der Python-Standardbibliothek kann verwendet werden, um Dateien in ZIPs zu komprimieren und ZIP-Dateien zu entpacken. Es ist in der Standardbibliothek enthalten, so dass keine zusätzliche Installation erforderlich ist.

Die folgenden Inhalte werden erläutert.

  • Komprimieren mehrerer Dateien in eine ZIP-Datei
  • Hinzufügen einer neuen Datei zu einer bestehenden ZIP-Datei
  • Komprimieren eines Verzeichnisses (Ordners) in eine ZIP-Datei
  • Komprimiert in einer ZIP-Datei mit einem Passwort
  • Überprüfen Sie den Inhalt der ZIP-Datei.
  • Extrahieren (entpacken) Sie den gesamten Inhalt der ZIP-Datei.
  • Wählen Sie den Inhalt der ZIP-Datei aus und entpacken Sie sie.

Komprimieren mehrerer Dateien in eine ZIP-Datei

Erstellen Sie ein ZipFile-Objekt und fügen Sie mit der write()-Methode die Dateien hinzu, die Sie komprimieren möchten.

Um eine neue ZIP-Datei zu erstellen, geben Sie den Pfad der zu erstellenden ZIP-Datei als erstes Argument des Konstruktors des ZipFile-Objekts und das zweite Argument wie folgt an'w'

Darüber hinaus kann als drittes Argument die Kompressionsmethode angegeben werden.

  • zipfile.ZIP_STORED:Einfach mehrere Dateien ohne Komprimierung kombinieren (Standard)
  • zipfile.ZIP_DEFLATED:Normale ZIP-Komprimierung (zlib-Modul erforderlich)
  • zipfile.ZIP_BZIP2:BZIP2-Komprimierung (bz2-Modul erforderlich)
  • zipfile.ZIP_LZMA:LZMA-Komprimierung (lzma-Modul erforderlich)

BZIP2 und LZMA haben ein höheres Komprimierungsverhältnis (können auf eine kleinere Größe komprimiert werden), aber die für die Komprimierung erforderliche Zeit ist länger.

Bei der Methode write() wird die Datei mit dem ersten Argument filename in eine ZIP-Datei mit dem zweiten Argument arcname geschrieben. Wenn arcname weggelassen wird, wird filename unverändert verwendet. arcname kann auch eine Verzeichnisstruktur angeben.

Das ZipFile-Objekt muss mit der close()-Methode geschlossen werden, aber wenn Sie die with-Anweisung verwenden, wird es automatisch geschlossen, wenn der Block beendet ist.

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')

Durch Angabe des Arguments compress_type der Methode write() ist es auch möglich, die Komprimierungsmethode für jede Datei auszuwählen.

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')

Hinzufügen einer neuen Datei zu einer bestehenden ZIP-Datei

Um eine neue Datei zu einer vorhandenen Zip-Datei hinzuzufügen, setzen Sie das erste Argument des Konstruktors beim Erstellen des ZipFile-Objekts auf den Pfad der vorhandenen Zip-Datei. Setzen Sie auch das zweite Argument Modus wie folgt.'a'

Dann fügen Sie, wie im obigen Beispiel, die Datei einfach mit der Methode write() hinzu.

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

Komprimieren eines Verzeichnisses (Ordners) in eine ZIP-Datei

Wenn Sie ein ganzes Verzeichnis (Ordner) in eine einzelne ZIP-Datei komprimieren wollen, können Sie os.scandir() oder os.listdir() verwenden, um eine Liste von Dateien zu erstellen, aber es ist einfacher, make_archive() im shutil-Modul zu verwenden.

Siehe den folgenden Artikel.

Komprimiert in einer ZIP-Datei mit einem Passwort

Mit dem zipfile-Modul können Sie keine passwortgeschützten ZIPs erstellen. Wenn Sie eine Datei in eine passwortgeschützte ZIP-Datei komprimieren möchten, verwenden Sie die Drittanbieter-Bibliothek pyminizip.

Beachten Sie, dass die Dekomprimierung passwortgeschützter ZIP-Dateien mit dem zipfile-Modul (siehe unten) durchgeführt werden kann.

Überprüfen Sie den Inhalt der ZIP-Datei.

Sie können den Inhalt einer vorhandenen ZIP-Datei überprüfen.

Erstellen Sie ein ZipFile-Objekt, indem Sie das erste Argument file im Konstruktor auf den Pfad der vorhandenen Zip-Datei und das zweite Argument mode auf 'r' setzen. Das Argument mode kann weggelassen werden, da der Standardwert 'r' ist.

Sie können die Methode namelist() des ZipFile-Objekts verwenden, um eine Liste der archivierten Dateien zu erhalten.

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']

Extrahieren (entpacken) Sie den gesamten Inhalt der ZIP-Datei.

Um den Inhalt einer ZIP-Datei zu entpacken, erstellen Sie ein ZipFile-Objekt mit dem ersten Argument file im Konstruktor als Pfad zur vorhandenen ZIP-Datei und dem zweiten Argument mode als 'r', wie im obigen Beispiel. Das Argument mode kann weggelassen werden, da es standardmäßig auf 'r' gesetzt ist.

Die Methode extractall() des ZipFile-Objekts extrahiert (dekomprimiert) den gesamten Inhalt der ZIP-Datei. Das erste Argument, path, gibt den Pfad des Verzeichnisses an, in das entpackt werden soll. Wird es weggelassen, werden die Dateien in das aktuelle Verzeichnis extrahiert.

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

Eine ZIP-Datei mit einem Kennwort kann extrahiert werden, indem das Kennwort als Argument pwd der Methode extractall() angegeben wird.

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

Wählen Sie den Inhalt der ZIP-Datei aus und entpacken Sie sie.

Wenn Sie nur bestimmte Dateien entpacken und extrahieren möchten, verwenden Sie die Methode extract().

Das erste Argument der Methode extract() ist der Name der zu extrahierenden Datei, das zweite Argument path ist der Pfad des Verzeichnisses, in das extrahiert werden soll. Wenn das Argument path weggelassen wird, wird die Datei in das aktuelle Verzeichnis extrahiert. Der Name der zu extrahierenden Datei sollte den Pfad zu dem Verzeichnis in der ZIP-Datei enthalten, wenn sie dort gespeichert ist.

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

Wie die extractall()-Methode erlaubt auch die extract()-Methode die Angabe eines Passworts als 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')