zipfile — Arbeiten mit ZIP-Archiven

Quellcode: Lib/zipfile/


Das ZIP-Dateiformat ist ein gängiger Archivierungs- und Komprimierungsstandard. Dieses Modul bietet Werkzeuge zum Erstellen, Lesen, Schreiben, Anhängen und Auflisten von ZIP-Dateien. Für fortgeschrittene Verwendungen dieses Moduls ist ein Verständnis des Formats erforderlich, wie es im PKZIP Application Note definiert ist.

Dieses Modul behandelt derzeit keine mehrplattigen ZIP-Dateien. Es kann ZIP-Dateien verarbeiten, die ZIP64-Erweiterungen verwenden (d. h. ZIP-Dateien, die größer als 4 GiB sind). Es unterstützt die Entschlüsselung von verschlüsselten Dateien in ZIP-Archiven, kann jedoch derzeit keine verschlüsselten Dateien erstellen. Die Entschlüsselung ist extrem langsam, da sie in nativem Python und nicht in C implementiert ist.

Das Modul definiert die folgenden Elemente

exception zipfile.BadZipFile

Der Fehler, der bei fehlerhaften ZIP-Dateien ausgelöst wird.

Hinzugefügt in Version 3.2.

exception zipfile.BadZipfile

Alias von BadZipFile, zur Kompatibilität mit älteren Python-Versionen.

Veraltet seit Version 3.2.

exception zipfile.LargeZipFile

Der Fehler, der ausgelöst wird, wenn eine ZIP-Datei ZIP64-Funktionalität erfordert, diese aber nicht aktiviert wurde.

class zipfile.ZipFile

Die Klasse zum Lesen und Schreiben von ZIP-Dateien. Einzelheiten zum Konstruktor finden Sie im Abschnitt ZipFile-Objekte.

class zipfile.Path

Klasse, die eine Teilmenge der von pathlib.Path bereitgestellten Schnittstelle implementiert, einschließlich der vollständigen importlib.resources.abc.Traversable-Schnittstelle.

Hinzugefügt in Version 3.8.

class zipfile.PyZipFile

Klasse zum Erstellen von ZIP-Archiven, die Python-Bibliotheken enthalten.

class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))

Klasse zur Darstellung von Informationen über ein Mitglied eines Archivs. Instanzen dieser Klasse werden von den Methoden getinfo() und infolist() von ZipFile-Objekten zurückgegeben. Die meisten Benutzer des Moduls zipfile müssen diese nicht selbst erstellen, sondern nur die von diesem Modul erstellten verwenden. filename sollte der vollständige Name des Archivmitglieds sein, und date_time sollte ein Tupel aus sechs Feldern sein, die die Zeit der letzten Änderung der Datei beschreiben; die Felder werden im Abschnitt ZipInfo-Objekte beschrieben.

Geändert in Version 3.13: Ein öffentliches Attribut compress_level wurde hinzugefügt, um das ehemals geschützte Attribut _compresslevel offenzulegen. Der ältere geschützte Name funktioniert weiterhin als Eigenschaft zur Abwärtskompatibilität.

_for_archive(archive)

Auflösen von date_time, Komprimierungsattributen und externen Attributen zu geeigneten Standardwerten, wie sie von ZipFile.writestr() verwendet werden.

Gibt self für Verkettung zurück.

Hinzugefügt in Version 3.14.

zipfile.is_zipfile(filename)

Gibt True zurück, wenn filename eine gültige ZIP-Datei ist, basierend auf ihrer Magie-Nummer, andernfalls gibt sie False zurück. filename kann auch ein Datei- oder dateiähnliches Objekt sein.

Geändert in Version 3.1: Unterstützung für Dateien und dateiähnliche Objekte.

zipfile.ZIP_STORED

Die numerische Konstante für ein unkomprimiertes Archivmitglied.

zipfile.ZIP_DEFLATED

Die numerische Konstante für die übliche ZIP-Kompressionsmethode. Dies erfordert das Modul zlib.

zipfile.ZIP_BZIP2

Die numerische Konstante für die BZIP2-Kompressionsmethode. Dies erfordert das Modul bz2.

Hinzugefügt in Version 3.3.

zipfile.ZIP_LZMA

Die numerische Konstante für die LZMA-Kompressionsmethode. Dies erfordert das Modul lzma.

Hinzugefügt in Version 3.3.

zipfile.ZIP_ZSTANDARD

Die numerische Konstante für Zstandard-Komprimierung. Dies erfordert das Modul compression.zstd.

Hinweis

In APPNOTE 6.3.7 wurde die Methodennummer 20 der Zstandard-Komprimierung zugewiesen. Dies wurde in APPNOTE 6.3.8 auf die Methodennummer 93 geändert, um Konflikte zu vermeiden, wobei die Methodennummer 20 als veraltet markiert wurde. Zur Kompatibilität liest das Modul zipfile beide Methodennummern, schreibt aber Daten nur mit der Methodennummer 93.

Hinzugefügt in Version 3.14.

Hinweis

Die Spezifikation des ZIP-Dateiformats enthält seit 2001 Unterstützung für bzip2-Komprimierung, seit 2006 für LZMA-Komprimierung und seit 2020 für Zstandard-Komprimierung. Einige Werkzeuge (einschließlich älterer Python-Versionen) unterstützen diese Komprimierungsmethoden jedoch nicht und lehnen die Verarbeitung der ZIP-Datei möglicherweise ganz ab oder können einzelne Dateien nicht extrahieren.

Siehe auch

PKZIP Application Note

Dokumentation zum ZIP-Dateiformat von Phil Katz, dem Erfinder des Formats und der verwendeten Algorithmen.

Info-ZIP Home Page

Informationen über die ZIP-Archivprogramme und Entwicklungsbibliotheken des Info-ZIP-Projekts.

ZipFile-Objekte

class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)

Öffnen einer ZIP-Datei, wobei file ein Pfad zu einer Datei (eine Zeichenkette), ein dateiähnliches Objekt oder ein pfadähnliches Objekt sein kann.

Der Parameter mode sollte 'r' sein, um eine vorhandene Datei zu lesen, 'w', um eine neue Datei abzuschneiden und zu schreiben, 'a', um eine vorhandene Datei anzuhängen, oder 'x', um eine neue Datei exklusiv zu erstellen und zu schreiben. Wenn mode 'x' ist und file auf eine vorhandene Datei verweist, wird ein FileExistsError ausgelöst. Wenn mode 'a' ist und file auf eine vorhandene ZIP-Datei verweist, werden zusätzliche Dateien daran angehängt. Wenn file nicht auf eine ZIP-Datei verweist, wird ein neues ZIP-Archiv an die Datei angehängt. Dies dient dazu, ein ZIP-Archiv an eine andere Datei anzuhängen (wie z. B. python.exe). Wenn mode 'a' ist und die Datei überhaupt nicht existiert, wird sie erstellt. Wenn mode 'r' oder 'a' ist, sollte die Datei suchbar sein.

compression ist die beim Schreiben des Archivs zu verwendende ZIP-Kompressionsmethode und sollte ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA oder ZIP_ZSTANDARD sein; nicht erkannte Werte führen zum Auslösen von NotImplementedError. Wenn ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA oder ZIP_ZSTANDARD angegeben ist, aber das entsprechende Modul (zlib, bz2, lzma oder compression.zstd) nicht verfügbar ist, wird RuntimeError ausgelöst. Der Standardwert ist ZIP_STORED.

Wenn allowZip64 auf True (Standard) gesetzt ist, erstellt zipfile ZIP-Dateien, die die ZIP64-Erweiterungen verwenden, wenn die ZIP-Datei größer als 4 GiB ist. Wenn es auf false gesetzt ist, löst zipfile eine Ausnahme aus, wenn die ZIP-Datei ZIP64-Erweiterungen erfordert.

Der Parameter compresslevel steuert die Komprimierungsstufe, die beim Schreiben von Dateien in das Archiv verwendet wird. Bei Verwendung von ZIP_STORED oder ZIP_LZMA hat er keine Auswirkung. Bei Verwendung von ZIP_DEFLATED werden Ganzzahlen von 0 bis 9 akzeptiert (siehe zlib für weitere Informationen). Bei Verwendung von ZIP_BZIP2 werden Ganzzahlen von 1 bis 9 akzeptiert (siehe bz2 für weitere Informationen). Bei Verwendung von ZIP_ZSTANDARD werden üblicherweise Ganzzahlen von -131072 bis 22 akzeptiert (siehe CompressionParameter.compression_level für weitere Informationen zum Abrufen gültiger Werte und deren Bedeutung).

Das Argument strict_timestamps erlaubt bei False das Zippen von Dateien vor dem 01.01.1980 auf Kosten der Einstellung des Zeitstempels auf den 01.01.1980. Ein ähnliches Verhalten tritt bei Dateien nach dem 31.12.2107 auf, der Zeitstempel wird ebenfalls auf den Grenzwert gesetzt.

Wenn im Modus 'r' metadata_encoding auf den Namen eines Codecs gesetzt werden kann, der zum Dekodieren von Metadaten wie Mitgliedsnamen und ZIP-Kommentaren verwendet wird.

Wenn die Datei im Modus 'w', 'x' oder 'a' erstellt und dann ohne Hinzufügen von Dateien zum Archiv geschlossen wird, werden die entsprechenden ZIP-Strukturen für ein leeres Archiv in die Datei geschrieben.

ZipFile ist auch ein Kontextmanager und unterstützt daher die with-Anweisung. Im Beispiel wird myzip nach Beendigung des Suite-Blocks der with-Anweisung geschlossen – auch wenn eine Ausnahme auftritt.

with ZipFile('spam.zip', 'w') as myzip:
    myzip.write('eggs.txt')

Hinweis

metadata_encoding ist eine instanzweite Einstellung für ZipFile. Derzeit ist es nicht möglich, dies pro Mitglied festzulegen.

Dieses Attribut ist eine Umgehungslösung für ältere Implementierungen, die Archive mit Namen in der aktuellen Locale-Kodierung oder Codepage (hauptsächlich unter Windows) erzeugen. Gemäß dem .ZIP-Standard kann die Kodierung von Metadaten entweder als IBM-Codepage (Standard) oder als UTF-8 durch ein Flag im Archiv-Header angegeben werden. Dieses Flag hat Vorrang vor metadata_encoding, das eine Python-spezifische Erweiterung ist.

Geändert in Version 3.2: Hinzugefügt die Möglichkeit, ZipFile als Kontextmanager zu verwenden.

Geändert in Version 3.3: Unterstützung für bzip2 und lzma Komprimierung hinzugefügt.

Geändert in Version 3.4: ZIP64-Erweiterungen sind standardmäßig aktiviert.

Geändert in Version 3.5: Unterstützung für das Schreiben in nicht suchbare Streams hinzugefügt. Unterstützung für den Modus 'x' hinzugefügt.

Geändert in Version 3.6: Zuvor wurde eine einfache RuntimeError für nicht erkannte Kompressionswerte ausgelöst.

Geändert in Version 3.6.2: Der Parameter file akzeptiert ein pfadähnliches Objekt.

Geändert in Version 3.7: Hinzugefügt den Parameter compresslevel.

Geändert in Version 3.8: Der Keyword-Only-Parameter strict_timestamps.

Geändert in Version 3.11: Unterstützung für die Angabe der Kodierung von Mitgliedsnamen zum Lesen von Metadaten im Verzeichnis und in den Kopfzeilen von ZIP-Dateien hinzugefügt.

ZipFile.close()

Schließt die Archivdatei. Sie müssen close() aufrufen, bevor Sie Ihr Programm beenden, oder wesentliche Datensätze werden nicht geschrieben.

ZipFile.getinfo(name)

Gibt ein ZipInfo-Objekt mit Informationen über das Archivmitglied name zurück. Der Aufruf von getinfo() für einen Namen, der sich derzeit nicht im Archiv befindet, löst eine KeyError aus.

ZipFile.infolist()

Gibt eine Liste zurück, die für jedes Mitglied des Archivs ein ZipInfo-Objekt enthält. Die Objekte sind in derselben Reihenfolge wie ihre Einträge in der tatsächlichen ZIP-Datei auf der Festplatte, wenn ein vorhandenes Archiv geöffnet wurde.

ZipFile.namelist()

Gibt eine Liste der Archivmitglieder nach Namen zurück.

ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)

Greift auf ein Mitglied des Archivs als binäres dateiähnliches Objekt zu. name kann entweder der Name einer Datei im Archiv oder ein ZipInfo-Objekt sein. Der Parameter mode muss, falls vorhanden, 'r' (Standard) oder 'w' sein. pwd ist das Passwort zur Entschlüsselung verschlüsselter ZIP-Dateien als bytes-Objekt.

open() ist auch ein Kontextmanager und unterstützt daher die with-Anweisung.

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

Mit mode 'r' ist das dateiähnliche Objekt (ZipExtFile) schreibgeschützt und bietet die folgenden Methoden: read(), readline(), readlines(), seek(), tell(), __iter__(), __next__(). Diese Objekte können unabhängig vom ZipFile arbeiten.

Mit mode='w' wird ein schreibbares Dateihandle zurückgegeben, das die Methode write() unterstützt. Solange ein schreibbares Dateihandle geöffnet ist, führt der Versuch, andere Dateien im ZIP-Archiv zu lesen oder zu schreiben, zu einer ValueError aus.

In beiden Fällen verfügt das dateiähnliche Objekt über die Attribute name, das dem Namen einer Datei im Archiv entspricht, und mode, das 'rb' oder 'wb' ist, je nach Eingabemodus.

Beim Schreiben einer Datei, wenn die Dateigröße nicht im Voraus bekannt ist, aber 2 GiB überschreiten könnte, übergeben Sie force_zip64=True, um sicherzustellen, dass das Header-Format große Dateien unterstützt. Wenn die Dateigröße im Voraus bekannt ist, erstellen Sie ein ZipInfo-Objekt mit gesetztem file_size und verwenden Sie dieses als Parameter name.

Hinweis

Die Methoden open(), read() und extract() können einen Dateinamen oder ein ZipInfo-Objekt akzeptieren. Das wird Ihnen zugute kommen, wenn Sie versuchen, eine ZIP-Datei zu lesen, die Member mit doppelten Namen enthält.

Geändert in Version 3.6: Unterstützung für mode='U' entfernt. Verwenden Sie io.TextIOWrapper, um komprimierte Textdateien im Modus Universal Newlines zu lesen.

Geändert in Version 3.6: ZipFile.open() kann nun verwendet werden, um Dateien mit der Option mode='w' in das Archiv zu schreiben.

Geändert in Version 3.6: Das Aufrufen von open() für ein geschlossenes ZipFile löst einen ValueError aus. Zuvor wurde ein RuntimeError ausgelöst.

Geändert in Version 3.13: Attribute name und mode für das beschreibbare, dateiähnliche Objekt hinzugefügt. Der Wert des Attributs mode für das lesbare, dateiähnliche Objekt wurde von 'r' zu 'rb' geändert.

ZipFile.extract(member, path=None, pwd=None)

Extrahiert ein Mitglied aus dem Archiv in das aktuelle Arbeitsverzeichnis; member muss dessen vollständiger Name oder ein ZipInfo-Objekt sein. Seine Dateiinformationen werden so genau wie möglich extrahiert. path gibt ein anderes Verzeichnis an, in das extrahiert werden soll. member kann ein Dateiname oder ein ZipInfo-Objekt sein. pwd ist das Passwort für verschlüsselte Dateien als bytes-Objekt.

Gibt den normalisierten Pfad zurück, der erstellt wurde (ein Verzeichnis oder eine neue Datei).

Hinweis

Wenn ein Mitgliedsdateiname ein absoluter Pfad ist, werden ein Laufwerks-/UNC-Sharepoint und führende (Rückwärts-)Schrägstriche entfernt, z. B.: ///foo/bar wird unter Unix zu foo/bar und C:\foo\bar wird unter Windows zu foo\bar. Und alle ".."-Komponenten in einem Mitgliedsdateinamen werden entfernt, z. B.: ../../foo../../ba..r wird zu foo../ba..r. Unter Windows werden ungültige Zeichen (:, <, >, |, ", ? und *) durch Unterstriche (_) ersetzt.

Geändert in Version 3.6: Das Aufrufen von extract() für ein geschlossenes ZipFile löst einen ValueError aus. Zuvor wurde ein RuntimeError ausgelöst.

Geändert in Version 3.6.2: Der Parameter path akzeptiert ein pfadähnliches Objekt.

ZipFile.extractall(path=None, members=None, pwd=None)

Extrahiert alle Mitglieder aus dem Archiv in das aktuelle Arbeitsverzeichnis. path gibt ein anderes Verzeichnis an, in das extrahiert werden soll. members ist optional und muss eine Teilmenge der von namelist() zurückgegebenen Liste sein. pwd ist das Passwort für verschlüsselte Dateien als bytes-Objekt.

Warnung

Extrahieren Sie niemals Archive aus nicht vertrauenswürdigen Quellen, ohne diese vorher zu überprüfen. Es ist möglich, dass Dateien außerhalb von path erstellt werden, z. B. Member mit absoluten Dateinamen, die mit "/" beginnen, oder Dateinamen mit zwei Punkten "..". Dieses Modul versucht, dies zu verhindern. Siehe den Hinweis zu extract().

Geändert in Version 3.6: Das Aufrufen von extractall() für ein geschlossenes ZipFile löst einen ValueError aus. Zuvor wurde ein RuntimeError ausgelöst.

Geändert in Version 3.6.2: Der Parameter path akzeptiert ein pfadähnliches Objekt.

ZipFile.printdir()

Gibt ein Inhaltsverzeichnis für das Archiv auf sys.stdout aus.

ZipFile.setpassword(pwd)

Legt pwd (ein bytes-Objekt) als Standardpasswort für die Extraktion verschlüsselter Dateien fest.

ZipFile.read(name, pwd=None)

Gibt die Bytes der Datei name im Archiv zurück. name ist der Name der Datei im Archiv oder ein ZipInfo-Objekt. Das Archiv muss zum Lesen oder Anhängen geöffnet sein. pwd ist das Passwort für verschlüsselte Dateien als bytes-Objekt und überschreibt, wenn angegeben, das Standardpasswort, das mit setpassword() festgelegt wurde. Das Aufrufen von read() für ein ZipFile, das eine andere Kompressionsmethode als ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA oder ZIP_ZSTANDARD verwendet, löst eine NotImplementedError aus. Ein Fehler wird ebenfalls ausgelöst, wenn das entsprechende Kompressionsmodul nicht verfügbar ist.

Geändert in Version 3.6: Das Aufrufen von read() für ein geschlossenes ZipFile löst einen ValueError aus. Zuvor wurde ein RuntimeError ausgelöst.

ZipFile.testzip()

Liest alle Dateien im Archiv und prüft deren CRC-Werte und Dateikopfzeilen. Gibt den Namen der ersten fehlerhaften Datei zurück, andernfalls None.

Geändert in Version 3.6: Das Aufrufen von testzip() für ein geschlossenes ZipFile löst einen ValueError aus. Zuvor wurde ein RuntimeError ausgelöst.

ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)

Schreibt die Datei mit dem Namen filename in das Archiv und gibt ihr den Archivnamen arcname (standardmäßig ist dies derselbe wie filename, jedoch ohne Laufwerksbuchstaben und mit entfernten führenden Pfadtrennzeichen). Wenn angegeben, überschreibt compress_type den für den compression-Parameter des Konstruktors für den neuen Eintrag angegebenen Wert. Ebenso überschreibt compresslevel den Konstruktor, wenn er angegeben ist. Das Archiv muss mit den Modi 'w', 'x' oder 'a' geöffnet sein.

Hinweis

Der ZIP-Dateistandard spezifizierte historisch keine Metadatenkodierung, empfahl aber nachdrücklich CP437 (die ursprüngliche IBM PC-Kodierung) zur Interoperabilität. Neuere Versionen erlauben die Verwendung von UTF-8 (nur). In diesem Modul wird UTF-8 automatisch verwendet, um die Membernamen zu schreiben, wenn sie Nicht-ASCII-Zeichen enthalten. Es ist nicht möglich, Membernamen in einer anderen Kodierung als ASCII oder UTF-8 zu schreiben.

Hinweis

Archivnamen sollten relativ zum Archivstammverzeichnis sein, d. h. sie sollten nicht mit einem Pfadtrennzeichen beginnen.

Hinweis

Wenn arcname (oder filename, wenn arcname nicht angegeben ist) ein Null-Byte enthält, wird der Name der Datei im Archiv am Null-Byte abgeschnitten.

Hinweis

Ein führender Schrägstrich im Dateinamen kann dazu führen, dass das Archiv auf einigen ZIP-Programmen unter Windows-Systemen nicht geöffnet werden kann.

Geändert in Version 3.6: Das Aufrufen von write() für ein mit dem Modus 'r' erstelltes ZipFile oder ein geschlossenes ZipFile löst einen ValueError aus. Zuvor wurde ein RuntimeError ausgelöst.

ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)

Schreibt eine Datei in das Archiv. Der Inhalt ist data, der entweder eine str- oder bytes-Instanz sein kann; wenn es sich um einen str handelt, wird er zuerst als UTF-8 kodiert. zinfo_or_arcname ist entweder der Dateiname, den er im Archiv erhält, oder eine ZipInfo-Instanz. Wenn es sich um eine Instanz handelt, müssen mindestens Dateiname, Datum und Uhrzeit angegeben werden. Wenn es sich um einen Namen handelt, werden Datum und Uhrzeit auf das aktuelle Datum und die aktuelle Uhrzeit gesetzt. Das Archiv muss mit den Modi 'w', 'x' oder 'a' geöffnet sein.

Wenn angegeben, überschreibt compress_type den für den compression-Parameter des Konstruktors für den neuen Eintrag oder in zinfo_or_arcname (wenn dies eine ZipInfo-Instanz ist) angegebenen Wert. Ebenso überschreibt compresslevel den Konstruktor, wenn er angegeben ist.

Hinweis

Beim Übergeben einer ZipInfo-Instanz als Parameter zinfo_or_arcname ist die verwendete Kompressionsmethode diejenige, die im Member compress_type der gegebenen ZipInfo-Instanz angegeben ist. Standardmäßig setzt der Konstruktor ZipInfo diesen Member auf ZIP_STORED.

Geändert in Version 3.2: Das Argument compress_type.

Geändert in Version 3.6: Das Aufrufen von writestr() für ein mit dem Modus 'r' erstelltes ZipFile oder ein geschlossenes ZipFile löst einen ValueError aus. Zuvor wurde ein RuntimeError ausgelöst.

ZipFile.mkdir(zinfo_or_directory, mode=511)

Erstellt ein Verzeichnis im Archiv. Wenn zinfo_or_directory ein String ist, wird ein Verzeichnis im Archiv mit dem im Argument mode angegebenen Modus erstellt. Wenn zinfo_or_directory jedoch eine ZipInfo-Instanz ist, wird das Argument mode ignoriert.

Das Archiv muss mit den Modi 'w', 'x' oder 'a' geöffnet sein.

Hinzugefügt in Version 3.11.

Folgende Datenattribute sind ebenfalls verfügbar

ZipFile.filename

Name der ZIP-Datei.

ZipFile.debug

Die Stufe der Debug-Ausgabe, die verwendet werden soll. Diese kann von 0 (Standard, keine Ausgabe) bis 3 (maximale Ausgabe) eingestellt werden. Debugging-Informationen werden nach sys.stdout geschrieben.

ZipFile.comment

Der Kommentar, der der ZIP-Datei zugeordnet ist, als bytes-Objekt. Wenn Sie einem mit den Modi 'w', 'x' oder 'a' erstellten ZipFile-Instanz einen Kommentar zuweisen, sollte dieser nicht länger als 65535 Bytes sein. Längere Kommentare werden abgeschnitten.

Pfadobjekte

class zipfile.Path(root, at='')

Konstruiert ein Path-Objekt aus einem root-Zipfile (das entweder eine ZipFile-Instanz oder eine für den Aufruf des ZipFile-Konstruktors geeignete file sein kann).

at gibt die Position dieses Pfads innerhalb des Zipfiles an, z. B. 'dir/file.txt', 'dir/' oder ''. Standard ist die leere Zeichenkette, was den Stamm angibt.

Hinweis

Die Klasse Path bereinigt Dateinamen innerhalb des ZIP-Archivs nicht. Im Gegensatz zu den Methoden ZipFile.extract() und ZipFile.extractall() ist es die Verantwortung des Aufrufers, Dateinamen zu validieren oder zu bereinigen, um Pfad-Traversal-Schwachstellen zu verhindern (z. B. Dateinamen, die ".." enthalten, oder absolute Pfade). Bei der Verarbeitung von nicht vertrauenswürdigen Archiven sollten Sie die Auflösung von Dateinamen mit os.path.abspath() und die Überprüfung gegen das Zielverzeichnis mit os.path.commonpath() in Betracht ziehen.

Pfadobjekte exponieren folgende Merkmale von pathlib.Path-Objekten

Pfadobjekte können mit dem Operator / oder joinpath durchlaufen werden.

Path.name

Die letzte Pfadkomponente.

Path.open(mode='r', *, pwd, **)

Ruft ZipFile.open() für den aktuellen Pfad auf. Ermöglicht das Öffnen zum Lesen oder Schreiben, Text oder Binärdaten über unterstützte Modi: 'r', 'w', 'rb', 'wb'. Positions- und Schlüsselwortargumente werden an io.TextIOWrapper übergeben, wenn sie als Text geöffnet werden, und andernfalls ignoriert. pwd ist der Parameter pwd für ZipFile.open().

Geändert in Version 3.9: Unterstützung für Text- und Binärmodi für open hinzugefügt. Der Standardmodus ist jetzt Text.

Geändert in Version 3.11.2: Der Parameter encoding kann als Positionsargument übergeben werden, ohne einen TypeError auszulösen. Dies war in 3.9 möglich. Code, der mit unveränderten Versionen von 3.10 und 3.11 kompatibel sein muss, muss alle Argumente von io.TextIOWrapper, einschließlich encoding, als Schlüsselwörter übergeben.

Path.iterdir()

Listet die Kinder des aktuellen Verzeichnisses auf.

Path.is_dir()

Gibt True zurück, wenn der aktuelle Kontext auf ein Verzeichnis verweist.

Path.is_file()

Gibt True zurück, wenn der aktuelle Kontext auf eine Datei verweist.

Gibt True zurück, wenn der aktuelle Kontext auf einen symbolischen Link verweist.

Hinzugefügt in Version 3.12.

Geändert in Version 3.13: Zuvor gab is_symlink bedingungslos False zurück.

Path.exists()

Gibt True zurück, wenn der aktuelle Kontext auf eine Datei oder ein Verzeichnis in der Zip-Datei verweist.

Path.suffix

Der letzte Punkt-getrennte Teil der letzten Komponente, falls vorhanden. Dies wird oft als Dateierweiterung bezeichnet.

Hinzugefügt in Version 3.11: Eigenschaft Path.suffix hinzugefügt.

Path.stem

Die letzte Pfadkomponente ohne ihre Erweiterung.

Hinzugefügt in Version 3.11: Eigenschaft Path.stem hinzugefügt.

Path.suffixes

Eine Liste der Erweiterungen des Pfads, oft als Dateierweiterungen bezeichnet.

Hinzugefügt in Version 3.11: Eigenschaft Path.suffixes hinzugefügt.

Path.read_text(*, **)

Liest die aktuelle Datei als Unicode-Text. Positions- und Schlüsselwortargumente werden an io.TextIOWrapper übergeben (außer buffer, das vom Kontext impliziert wird).

Geändert in Version 3.11.2: Der Parameter encoding kann als Positionsargument übergeben werden, ohne einen TypeError auszulösen. Dies war in 3.9 möglich. Code, der mit unveränderten Versionen von 3.10 und 3.11 kompatibel sein muss, muss alle Argumente von io.TextIOWrapper, einschließlich encoding, als Schlüsselwörter übergeben.

Path.read_bytes()

Liest die aktuelle Datei als Bytes.

Path.joinpath(*other)

Gibt ein neues Path-Objekt zurück, bei dem die Argumente von other verknüpft sind. Die folgenden sind äquivalent

>>> Path(...).joinpath('child').joinpath('grandchild')
>>> Path(...).joinpath('child', 'grandchild')
>>> Path(...) / 'child' / 'grandchild'

Geändert in Version 3.10: Vor Version 3.10 war joinpath undokumentiert und akzeptierte genau ein Argument.

Das Projekt zipp stellt Backports der neuesten Funktionalität von Pfadobjekten für ältere Python-Versionen bereit. Verwenden Sie zipp.Path anstelle von zipfile.Path, um frühzeitig Zugriff auf Änderungen zu erhalten.

PyZipFile-Objekte

Der Konstruktor PyZipFile akzeptiert dieselben Parameter wie der Konstruktor ZipFile und einen zusätzlichen Parameter, optimize.

class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)

Geändert in Version 3.2: Der Parameter optimize wurde hinzugefügt.

Geändert in Version 3.4: ZIP64-Erweiterungen sind standardmäßig aktiviert.

Instanzen haben zusätzlich zu denen von ZipFile-Objekten eine Methode

writepy(pathname, basename='', filterfunc=None)

Sucht nach Dateien *.py und fügt die entsprechende Datei zum Archiv hinzu.

Wenn der Parameter optimize an PyZipFile nicht angegeben wurde oder -1 war, ist die entsprechende Datei eine *.pyc-Datei, die bei Bedarf kompiliert wird.

Wenn der Parameter optimize an PyZipFile 0, 1 oder 2 war, werden nur Dateien mit diesem Optimierungslevel (siehe compile()) zum Archiv hinzugefügt, bei Bedarf wird kompiliert.

Wenn pathname eine Datei ist, muss der Dateiname mit .py enden, und nur die (entsprechende *.pyc) Datei wird auf der obersten Ebene hinzugefügt (keine Pfadinformationen). Wenn pathname eine Datei ist, die nicht mit .py endet, wird ein RuntimeError ausgelöst. Wenn es sich um ein Verzeichnis handelt und das Verzeichnis kein Paketverzeichnis ist, werden alle Dateien *.pyc auf der obersten Ebene hinzugefügt. Wenn das Verzeichnis ein Paketverzeichnis ist, werden alle *.pyc unter dem Paketnamen als Dateipfad hinzugefügt, und wenn Unterverzeichnisse Paketverzeichnisse sind, werden all diese rekursiv in sortierter Reihenfolge hinzugefügt.

basename ist nur für den internen Gebrauch bestimmt.

filterfunc, falls angegeben, muss eine Funktion sein, die ein einzelnes String-Argument akzeptiert. Sie wird für jeden Pfad (einschließlich jedes einzelnen vollständigen Dateipfads) aufgerufen, bevor er zum Archiv hinzugefügt wird. Wenn filterfunc einen falschen Wert zurückgibt, wird der Pfad nicht hinzugefügt, und wenn es sich um ein Verzeichnis handelt, werden dessen Inhalte ignoriert. Wenn unsere Testdateien beispielsweise alle entweder in test-Verzeichnissen liegen oder mit der Zeichenkette test_ beginnen, können wir eine filterfunc verwenden, um sie auszuschließen

>>> zf = PyZipFile('myprog.zip')
>>> def notests(s):
...     fn = os.path.basename(s)
...     return (not (fn == 'test' or fn.startswith('test_')))
...
>>> zf.writepy('myprog', filterfunc=notests)

Die Methode writepy() erstellt Archive mit Dateinamen wie diesem

string.pyc                   # Top level name
test/__init__.pyc            # Package directory
test/testall.pyc             # Module test.testall
test/bogus/__init__.pyc      # Subpackage directory
test/bogus/myfile.pyc        # Submodule test.bogus.myfile

Geändert in Version 3.4: Der Parameter filterfunc wurde hinzugefügt.

Geändert in Version 3.6.2: Der Parameter pathname akzeptiert ein pfadähnliches Objekt.

Geändert in Version 3.7: Rekursion sortiert Verzeichniseinträge.

ZipInfo-Objekte

Instanzen der Klasse ZipInfo werden von den Methoden getinfo() und infolist() von ZipFile-Objekten zurückgegeben. Jedes Objekt speichert Informationen über ein einzelnes Mitglied des ZIP-Archivs.

Es gibt eine Klassenmethode, um eine ZipInfo-Instanz für eine Datei auf dem Dateisystem zu erstellen

classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)

Konstruiert eine ZipInfo-Instanz für eine Datei auf dem Dateisystem, zur Vorbereitung für die Hinzufügung zu einer ZIP-Datei.

filename sollte der Pfad zu einer Datei oder einem Verzeichnis auf dem Dateisystem sein.

Wenn arcname angegeben ist, wird es als Name innerhalb des Archivs verwendet. Wenn arcname nicht angegeben ist, ist der Name derselbe wie filename, jedoch mit entferntem Laufwerksbuchstaben und führenden Pfadtrennzeichen.

Das Argument strict_timestamps erlaubt bei False das Zippen von Dateien vor dem 01.01.1980 auf Kosten der Einstellung des Zeitstempels auf den 01.01.1980. Ein ähnliches Verhalten tritt bei Dateien nach dem 31.12.2107 auf, der Zeitstempel wird ebenfalls auf den Grenzwert gesetzt.

Hinzugefügt in Version 3.6.

Geändert in Version 3.6.2: Der Parameter filename akzeptiert ein pfadähnliches Objekt.

Geändert in Version 3.8: Der schlüsselwortlose Parameter strict_timestamps wurde hinzugefügt.

Instanzen haben die folgenden Methoden und Attribute

ZipInfo.is_dir()

Gibt True zurück, wenn dieses Archivmitglied ein Verzeichnis ist.

Dies verwendet den Namen des Eintrags: Verzeichnisse sollten immer mit / enden.

Hinzugefügt in Version 3.6.

ZipInfo.filename

Name der Datei im Archiv.

ZipInfo.date_time

Die Uhrzeit und das Datum der letzten Änderung des Archivmitglieds. Dies ist ein Tupel aus sechs Werten, die die Felder "letzte [geänderte] Datei-Zeit" und "letzte [geänderte] Datei-Datum" aus dem zentralen Verzeichnis der ZIP-Datei darstellen.

Das Tupel enthält

Index

Wert

0

Jahr (>= 1980)

1

Monat (einsbasiert)

2

Tag des Monats (einsbasiert)

3

Stunden (nullbasiert)

4

Minuten (nullbasiert)

5

Sekunden (nullbasiert)

Hinweis

Das ZIP-Format unterstützt mehrere Zeitstempelfelder an verschiedenen Positionen (zentrales Verzeichnis, Erweiterungsfelder für NTFS/UNIX-Systeme usw.). Dieses Attribut gibt spezifisch den Zeitstempel aus dem zentralen Verzeichnis zurück. Das Zeitstempelformat des zentralen Verzeichnisses in ZIP-Dateien unterstützt keine Zeitstempel vor 1980. Obwohl einige Erweiterungsfelder (wie UNIX-Zeitstempel) frühere Daten darstellen können, gibt dieses Attribut nur den Zeitstempel des zentralen Verzeichnisses zurück.

Der Zeitstempel des zentralen Verzeichnisses wird als lokale Zeit und nicht als UTC-Zeit interpretiert, um das Verhalten anderer Zip-Tools nachzuahmen.

ZipInfo.compress_type

Art der Komprimierung für das Archivmitglied.

ZipInfo.comment

Kommentar für das einzelne Archivmitglied als bytes-Objekt.

ZipInfo.extra

Erweiterungsfeld-Daten. Die PKZIP Application Note enthält einige Kommentare zur internen Struktur der Daten in diesem bytes-Objekt.

ZipInfo.create_system

System, das das ZIP-Archiv erstellt hat.

ZipInfo.create_version

PKZIP-Version, die das ZIP-Archiv erstellt hat.

ZipInfo.extract_version

PKZIP-Version, die zum Extrahieren des Archivs erforderlich ist.

ZipInfo.reserved

Muss Null sein.

ZipInfo.flag_bits

ZIP-Flag-Bits.

ZipInfo.volume

Volumennummer des Dateikopfes.

ZipInfo.internal_attr

Interne Attribute.

ZipInfo.external_attr

Externe Dateiattribute.

ZipInfo.header_offset

Byte-Offset zum Dateikopf.

ZipInfo.CRC

CRC-32 der unkomprimierten Datei.

ZipInfo.compress_size

Größe der komprimierten Daten.

ZipInfo.file_size

Größe der unkomprimierten Datei.

Befehlszeilenschnittstelle

Das Modul zipfile bietet eine einfache Befehlszeilenschnittstelle zur Interaktion mit ZIP-Archiven.

Wenn Sie ein neues ZIP-Archiv erstellen möchten, geben Sie dessen Namen nach der Option -c an und listen Sie dann die zu inkludierenden Dateinamen auf

$ python -m zipfile -c monty.zip spam.txt eggs.txt

Die Angabe eines Verzeichnisses ist ebenfalls zulässig

$ python -m zipfile -c monty.zip life-of-brian_1979/

Wenn Sie ein ZIP-Archiv in das angegebene Verzeichnis extrahieren möchten, verwenden Sie die Option -e

$ python -m zipfile -e monty.zip target-dir/

Für eine Liste der Dateien in einem ZIP-Archiv verwenden Sie die Option -l

$ python -m zipfile -l monty.zip

Kommandozeilenoptionen

-l <zipfile>
--list <zipfile>

Listet Dateien in einem Zipfile auf.

-c <zipfile> <source1> ... <sourceN>
--create <zipfile> <source1> ... <sourceN>

Erstellt ein Zipfile aus Quelldateien.

-e <zipfile> <output_dir>
--extract <zipfile> <output_dir>

Extrahiert ein Zipfile in das Zielverzeichnis.

-t <zipfile>
--test <zipfile>

Testet, ob das Zipfile gültig ist oder nicht.

--metadata-encoding <encoding>

Gibt die Kodierung der Mitgliedsnamen für -l, -e und -t an.

Hinzugefügt in Version 3.11.

Tücken beim Dekomprimieren

Die Extraktion im zipfile-Modul kann aufgrund einiger unten aufgeführter Tücken fehlschlagen.

Aus der Datei selbst

Die Dekomprimierung kann aufgrund eines falschen Passworts / CRC-Prüfsumme / ZIP-Formats oder einer nicht unterstützten Komprimierungsmethode / Entschlüsselung fehlschlagen.

Dateisystembeschränkungen

Das Überschreiten von Beschränkungen auf verschiedenen Dateisystemen kann zu einem Dekomprimierungsfehler führen. Zum Beispiel erlaubte Zeichen in den Verzeichniseinträgen, Länge des Dateinamens, Länge des Pfadnamens, Größe einer einzelnen Datei und Anzahl der Dateien usw.

Ressourcenbeschränkungen

Ein Mangel an Arbeitsspeicher oder Festplattenspeicher kann zu einem Dekomprimierungsfehler führen. Zum Beispiel können Dekomprimierungsbomben (auch bekannt als ZIP-Bomben) auf die zipfile-Bibliothek angewendet werden, die zu einer Erschöpfung des Festplattenspeichers führen können.

Unterbrechung

Eine Unterbrechung während der Dekomprimierung, z. B. durch Drücken von Strg+C oder das Beenden des Dekomprimierungsprozesses, kann zu einer unvollständigen Dekomprimierung des Archivs führen.

Standardverhalten der Extraktion

Wenn die Standardextraktionsverhalten nicht bekannt sind, kann dies zu unerwarteten Dekomprimierungsergebnissen führen. Zum Beispiel werden beim zweimaligen Extrahieren desselben Archivs Dateien überschrieben, ohne nachzufragen.