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.Pathbereitgestellten Schnittstelle implementiert, einschließlich der vollständigenimportlib.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()undinfolist()vonZipFile-Objekten zurückgegeben. Die meisten Benutzer des Modulszipfilemü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_levelwurde hinzugefügt, um das ehemals geschützte Attribut_compressleveloffenzulegen. 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 vonZipFile.writestr()verwendet werden.Gibt
selffür Verkettung zurück.Hinzugefügt in Version 3.14.
- zipfile.is_zipfile(filename)¶
Gibt
Truezurück, wenn filename eine gültige ZIP-Datei ist, basierend auf ihrer Magie-Nummer, andernfalls gibt sieFalsezurü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
20der Zstandard-Komprimierung zugewiesen. Dies wurde in APPNOTE 6.3.8 auf die Methodennummer93geändert, um Konflikte zu vermeiden, wobei die Methodennummer20als veraltet markiert wurde. Zur Kompatibilität liest das Modulzipfilebeide Methodennummern, schreibt aber Daten nur mit der Methodennummer93.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 einFileExistsErrorausgelö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_LZMAoderZIP_ZSTANDARDsein; nicht erkannte Werte führen zum Auslösen vonNotImplementedError. WennZIP_DEFLATED,ZIP_BZIP2,ZIP_LZMAoderZIP_ZSTANDARDangegeben ist, aber das entsprechende Modul (zlib,bz2,lzmaodercompression.zstd) nicht verfügbar ist, wirdRuntimeErrorausgelöst. Der Standardwert istZIP_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 auffalsegesetzt ist, löstzipfileeine 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_STOREDoderZIP_LZMAhat er keine Auswirkung. Bei Verwendung vonZIP_DEFLATEDwerden Ganzzahlen von0bis9akzeptiert (siehezlibfür weitere Informationen). Bei Verwendung vonZIP_BZIP2werden Ganzzahlen von1bis9akzeptiert (siehebz2für weitere Informationen). Bei Verwendung vonZIP_ZSTANDARDwerden üblicherweise Ganzzahlen von-131072bis22akzeptiert (sieheCompressionParameter.compression_levelfür weitere Informationen zum Abrufen gültiger Werte und deren Bedeutung).Das Argument strict_timestamps erlaubt bei
Falsedas 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 Archivgeschlossenwird, 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 derwith-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,
ZipFileals Kontextmanager zu verwenden.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
RuntimeErrorfü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 vongetinfo()für einen Namen, der sich derzeit nicht im Archiv befindet, löst eineKeyErroraus.
- 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 alsbytes-Objekt.open()ist auch ein Kontextmanager und unterstützt daher diewith-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 Methodewrite()unterstützt. Solange ein schreibbares Dateihandle geöffnet ist, führt der Versuch, andere Dateien im ZIP-Archiv zu lesen oder zu schreiben, zu einerValueErroraus.In beiden Fällen verfügt das dateiähnliche Objekt über die Attribute
name, das dem Namen einer Datei im Archiv entspricht, undmode, 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 einZipInfo-Objekt mit gesetztemfile_sizeund verwenden Sie dieses als Parameter name.Hinweis
Die Methoden
open(),read()undextract()können einen Dateinamen oder einZipInfo-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 Sieio.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 Optionmode='w'in das Archiv zu schreiben.Geändert in Version 3.6: Das Aufrufen von
open()für ein geschlossenes ZipFile löst einenValueErroraus. Zuvor wurde einRuntimeErrorausgelöst.Geändert in Version 3.13: Attribute
nameundmodefür das beschreibbare, dateiähnliche Objekt hinzugefügt. Der Wert des Attributsmodefü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 einZipInfo-Objekt sein. pwd ist das Passwort für verschlüsselte Dateien alsbytes-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/barwird unter Unix zufoo/barundC:\foo\barwird unter Windows zufoo\bar. Und alle".."-Komponenten in einem Mitgliedsdateinamen werden entfernt, z. B.:../../foo../../ba..rwird zufoo../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 einenValueErroraus. Zuvor wurde einRuntimeErrorausgelö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 alsbytes-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 zuextract().Geändert in Version 3.6: Das Aufrufen von
extractall()für ein geschlossenes ZipFile löst einenValueErroraus. Zuvor wurde einRuntimeErrorausgelö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.stdoutaus.
- 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 alsbytes-Objekt und überschreibt, wenn angegeben, das Standardpasswort, das mitsetpassword()festgelegt wurde. Das Aufrufen vonread()für ein ZipFile, das eine andere Kompressionsmethode alsZIP_STORED,ZIP_DEFLATED,ZIP_BZIP2,ZIP_LZMAoderZIP_ZSTANDARDverwendet, löst eineNotImplementedErroraus. 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 einenValueErroraus. Zuvor wurde einRuntimeErrorausgelö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 einenValueErroraus. Zuvor wurde einRuntimeErrorausgelö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(oderfilename, wennarcnamenicht 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 einenValueErroraus. Zuvor wurde einRuntimeErrorausgelö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- oderbytes-Instanz sein kann; wenn es sich um einenstrhandelt, wird er zuerst als UTF-8 kodiert. zinfo_or_arcname ist entweder der Dateiname, den er im Archiv erhält, oder eineZipInfo-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 gegebenenZipInfo-Instanz angegeben ist. Standardmäßig setzt der KonstruktorZipInfodiesen Member aufZIP_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 einenValueErroraus. Zuvor wurde einRuntimeErrorausgelö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) bis3(maximale Ausgabe) eingestellt werden. Debugging-Informationen werden nachsys.stdoutgeschrieben.
Pfadobjekte¶
- class zipfile.Path(root, at='')¶
Konstruiert ein Path-Objekt aus einem
root-Zipfile (das entweder eineZipFile-Instanz oder eine für den Aufruf desZipFile-Konstruktors geeignetefilesein kann).atgibt 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
Pathbereinigt Dateinamen innerhalb des ZIP-Archivs nicht. Im Gegensatz zu den MethodenZipFile.extract()undZipFile.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 mitos.path.abspath()und die Überprüfung gegen das Zielverzeichnis mitos.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 anio.TextIOWrapperübergeben, wenn sie als Text geöffnet werden, und andernfalls ignoriert.pwdist der ParameterpwdfürZipFile.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
encodingkann als Positionsargument übergeben werden, ohne einenTypeErrorauszulö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 vonio.TextIOWrapper, einschließlichencoding, als Schlüsselwörter übergeben.
- Path.iterdir()¶
Listet die Kinder des aktuellen Verzeichnisses auf.
- Path.is_dir()¶
Gibt
Truezurück, wenn der aktuelle Kontext auf ein Verzeichnis verweist.
- Path.is_file()¶
Gibt
Truezurück, wenn der aktuelle Kontext auf eine Datei verweist.
- Path.is_symlink()¶
Gibt
Truezurü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_symlinkbedingungslosFalsezurück.
- Path.exists()¶
Gibt
Truezurü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.suffixhinzugefügt.
- Path.stem¶
Die letzte Pfadkomponente ohne ihre Erweiterung.
Hinzugefügt in Version 3.11: Eigenschaft
Path.stemhinzugefügt.
- Path.suffixes¶
Eine Liste der Erweiterungen des Pfads, oft als Dateierweiterungen bezeichnet.
Hinzugefügt in Version 3.11: Eigenschaft
Path.suffixeshinzugefügt.
- Path.read_text(*, **)¶
Liest die aktuelle Datei als Unicode-Text. Positions- und Schlüsselwortargumente werden an
io.TextIOWrapperübergeben (außerbuffer, das vom Kontext impliziert wird).Geändert in Version 3.11.2: Der Parameter
encodingkann als Positionsargument übergeben werden, ohne einenTypeErrorauszulö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 vonio.TextIOWrapper, einschließlichencoding, 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
joinpathundokumentiert 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
*.pyund fügt die entsprechende Datei zum Archiv hinzu.Wenn der Parameter optimize an
PyZipFilenicht angegeben wurde oder-1war, ist die entsprechende Datei eine*.pyc-Datei, die bei Bedarf kompiliert wird.Wenn der Parameter optimize an
PyZipFile0,1oder2war, werden nur Dateien mit diesem Optimierungslevel (siehecompile()) zum Archiv hinzugefügt, bei Bedarf wird kompiliert.Wenn pathname eine Datei ist, muss der Dateiname mit
.pyenden, und nur die (entsprechende*.pyc) Datei wird auf der obersten Ebene hinzugefügt (keine Pfadinformationen). Wenn pathname eine Datei ist, die nicht mit.pyendet, wird einRuntimeErrorausgelöst. Wenn es sich um ein Verzeichnis handelt und das Verzeichnis kein Paketverzeichnis ist, werden alle Dateien*.pycauf der obersten Ebene hinzugefügt. Wenn das Verzeichnis ein Paketverzeichnis ist, werden alle*.pycunter 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 Zeichenkettetest_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 diesemstring.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
Falsedas 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
Truezurü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
0Jahr (>= 1980)
1Monat (einsbasiert)
2Tag des Monats (einsbasiert)
3Stunden (nullbasiert)
4Minuten (nullbasiert)
5Sekunden (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.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¶
- -c <zipfile> <source1> ... <sourceN>¶
- --create <zipfile> <source1> ... <sourceN>¶
Erstellt ein Zipfile aus Quelldateien.
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.