lzma — Komprimierung mit dem LZMA-Algorithmus¶
Hinzugefügt in Version 3.3.
Quellcode: Lib/lzma.py
Dieses Modul stellt Klassen und praktische Funktionen zur Komprimierung und Dekomprimierung von Daten mit dem LZMA-Komprimierungsalgorithmus bereit. Ebenfalls enthalten ist eine Dateischnittstelle, die die .xz und älteren .lzma Dateiformate unterstützt, die vom Dienstprogramm xz verwendet werden, sowie rohe komprimierte Streams.
Die von diesem Modul bereitgestellte Schnittstelle ist der des Moduls bz2 sehr ähnlich. Beachten Sie, dass LZMAFile und bz2.BZ2File *nicht* threadsicher sind. Wenn Sie eine einzelne LZMAFile-Instanz aus mehreren Threads verwenden müssen, ist es notwendig, diese mit einem Lock zu schützen.
- Ausnahme lzma.LZMAError¶
Diese Ausnahme wird ausgelöst, wenn während der Komprimierung oder Dekomprimierung oder bei der Initialisierung des Komprimierungs-/Dekomprimierungszustands ein Fehler auftritt.
Komprimierte Dateien lesen und schreiben¶
- lzma.open(filename, mode='rb', *, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None)¶
Eine LZMA-komprimierte Datei im Binär- oder Textmodus öffnen und ein Datei-Objekt zurückgeben.
Das Argument filename kann entweder ein tatsächlicher Dateiname sein (als
str,bytesoder Pfad-ähnliches Objekt angegeben), in diesem Fall wird die benannte Datei geöffnet, oder es kann ein bestehendes Datei-Objekt zum Lesen oder Schreiben sein.Das Argument mode kann entweder
"r","rb","w","wb","x","xb","a"oder"ab"für den Binärmodus sein, oder"rt","wt","xt"oder"at"für den Textmodus. Der Standardwert ist"rb".Beim Öffnen einer Datei zum Lesen haben die Argumente format und filters die gleiche Bedeutung wie für
LZMADecompressor. In diesem Fall sollten die Argumente check und preset nicht verwendet werden.Beim Öffnen einer Datei zum Schreiben haben die Argumente format, check, preset und filters die gleiche Bedeutung wie für
LZMACompressor.Für den Binärmodus ist diese Funktion äquivalent zum Konstruktor
LZMAFile:LZMAFile(filename, mode, ...). In diesem Fall dürfen die Argumente encoding, errors und newline nicht angegeben werden.Für den Textmodus wird ein
LZMAFile-Objekt erstellt und in eineio.TextIOWrapper-Instanz mit der angegebenen Kodierung, Fehlerbehandlung und Zeilenumbrüchen eingepackt.Geändert in Version 3.4: Unterstützung für die Modi
"x","xb"und"xt"hinzugefügt.Geändert in Version 3.6: Akzeptiert ein pfadähnliches Objekt.
- Klasse lzma.LZMAFile(filename=None, mode='r', *, format=None, check=-1, preset=None, filters=None)¶
Eine LZMA-komprimierte Datei im Binärmodus öffnen.
Ein
LZMAFilekann ein bereits geöffnetes Datei-Objekt umschließen oder direkt mit einer benannten Datei arbeiten. Das Argument filename gibt entweder das zu umschließende Datei-Objekt oder den Namen der zu öffnenden Datei an (alsstr,bytesoder Pfad-ähnliches Objekt). Beim Umschließen eines vorhandenen Datei-Objekts wird die umschlossene Datei nicht geschlossen, wenn dieLZMAFilegeschlossen wird.Das Argument mode kann entweder
"r"zum Lesen (Standard),"w"zum Überschreiben,"x"zur exklusiven Erstellung oder"a"zum Anhängen sein. Diese können äquivalent als"rb","wb","xb"und"ab"angegeben werden.Wenn filename ein Datei-Objekt ist (anstatt eines tatsächlichen Dateinamens), kürzt ein Modus von
"w"die Datei nicht, sondern ist stattdessen äquivalent zu"a".Beim Öffnen einer Datei zum Lesen kann die Eingabedatei eine Verkettung mehrerer separater komprimierter Streams sein. Diese werden transparent als einzelner logischer Stream dekodiert.
Beim Öffnen einer Datei zum Lesen haben die Argumente format und filters die gleiche Bedeutung wie für
LZMADecompressor. In diesem Fall sollten die Argumente check und preset nicht verwendet werden.Beim Öffnen einer Datei zum Schreiben haben die Argumente format, check, preset und filters die gleiche Bedeutung wie für
LZMACompressor.LZMAFileunterstützt alle Mitglieder, die vonio.BufferedIOBasespezifiziert werden, außerdetach()undtruncate(). Iteration und diewith-Anweisung werden unterstützt.Die folgenden Methoden und Attribute werden ebenfalls bereitgestellt
- peek(size=-1)¶
Gibt gepufferte Daten zurück, ohne die Dateiposition zu ändern. Mindestens ein Byte Daten wird zurückgegeben, es sei denn, das EOF wurde erreicht. Die genaue Anzahl der zurückgegebenen Bytes ist nicht spezifiziert (das Argument size wird ignoriert).
- mode¶
'rb'zum Lesen und'wb'zum Schreiben.Hinzugefügt in Version 3.13.
- name¶
Der LZMA-Dateiname. Äquivalent zum Attribut
namedes zugrunde liegenden Datei-Objekts.Hinzugefügt in Version 3.13.
Geändert in Version 3.4: Unterstützung für die Modi
"x"und"xb"hinzugefügt.Geändert in Version 3.5: Die Methode
read()akzeptiert jetzt ein Argument vonNone.Geändert in Version 3.6: Akzeptiert ein pfadähnliches Objekt.
Daten im Speicher komprimieren und dekomprimieren¶
- Klasse lzma.LZMACompressor(format=FORMAT_XZ, check=-1, preset=None, filters=None)¶
Erstellt ein Komprimierungsobjekt, das zur inkrementellen Komprimierung von Daten verwendet werden kann.
Für eine bequemere Methode zum Komprimieren eines einzelnen Datenblocks siehe
compress().Das Argument format gibt an, welches Containerformat verwendet werden soll. Mögliche Werte sind
FORMAT_XZ: Das Containerformat.xz.Dies ist das Standardformat.
FORMAT_ALONE: Das ältere Containerformat.lzma.Dieses Format ist eingeschränkter als
.xz– es unterstützt keine Integritätsprüfungen oder mehrere Filter.
FORMAT_RAW: Ein roher Datenstrom, ohne Verwendung eines Containerformats.Dieser Formatbezeichner unterstützt keine Integritätsprüfungen und erfordert, dass Sie immer eine benutzerdefinierte Filterkette angeben (sowohl für die Komprimierung als auch für die Dekomprimierung). Zusätzlich können in diesem Format komprimierte Daten nicht mit
FORMAT_AUTOdekomprimiert werden (sieheLZMADecompressor).
Das Argument check gibt die Art der Integritätsprüfung an, die in die komprimierten Daten aufgenommen werden soll. Diese Prüfung wird bei der Dekomprimierung verwendet, um sicherzustellen, dass die Daten nicht beschädigt wurden. Mögliche Werte sind
CHECK_NONE: Keine Integritätsprüfung. Dies ist der Standardwert (und der einzig akzeptable Wert) fürFORMAT_ALONEundFORMAT_RAW.CHECK_CRC32: 32-Bit Cyclic Redundancy Check.CHECK_CRC64: 64-Bit Cyclic Redundancy Check. Dies ist der Standardwert fürFORMAT_XZ.CHECK_SHA256: 256-Bit Secure Hash Algorithm.
Wenn die angegebene Prüfung nicht unterstützt wird, wird eine
LZMAErrorausgelöst.Die Komprimierungseinstellungen können entweder als voreingestellte Komprimierungsstufe (mit dem Argument preset) oder detailliert als benutzerdefinierte Filterkette (mit dem Argument filters) angegeben werden.
Das Argument preset (falls angegeben) sollte eine Ganzzahl zwischen
0und9(einschließlich) sein, optional OR-verknüpft mit der KonstantePRESET_EXTREME. Wenn weder preset noch filters angegeben sind, ist das Standardverhalten die Verwendung vonPRESET_DEFAULT(voreingestellte Stufe6). Höhere Voreinstellungen erzeugen kleinere Ausgaben, verlangsamen aber den Komprimierungsprozess.Hinweis
Neben der höheren CPU-Belastung erfordert die Komprimierung mit höheren Voreinstellungen auch deutlich mehr Speicher (und erzeugt Ausgaben, die zum Dekomprimieren mehr Speicher benötigen). Bei der Voreinstellung
9beispielsweise kann der Overhead für einLZMACompressor-Objekt bis zu 800 MiB betragen. Aus diesem Grund ist es im Allgemeinen am besten, bei der Standardeinstellung zu bleiben.Das Argument filters (falls angegeben) sollte ein Filterketten-Spezifizierer sein. Details finden Sie unter Angabe benutzerdefinierter Filterketten.
- compress(data)¶
Komprimiert data (ein
bytes-Objekt) und gibt einbytes-Objekt mit komprimierten Daten für mindestens einen Teil der Eingabe zurück. Ein Teil von data kann intern gepuffert werden, für die Verwendung in späteren Aufrufen voncompress()undflush(). Die zurückgegebenen Daten sollten mit der Ausgabe früherer Aufrufe voncompress()verkettet werden.
- Klasse lzma.LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None)¶
Erstellt ein Dekomprimierungsobjekt, das zur inkrementellen Dekomprimierung von Daten verwendet werden kann.
Für eine bequemere Methode zum Dekomprimieren eines gesamten komprimierten Streams auf einmal siehe
decompress().Das Argument format gibt das zu verwendende Containerformat an. Der Standardwert ist
FORMAT_AUTO, das sowohl.xz- als auch.lzma-Dateien dekomprimieren kann. Andere mögliche Werte sindFORMAT_XZ,FORMAT_ALONEundFORMAT_RAW.Das Argument memlimit gibt eine Grenze (in Bytes) für den Arbeitsspeicher an, den der Dekomprimierer verwenden darf. Wenn dieses Argument verwendet wird, schlägt die Dekomprimierung mit einer
LZMAErrorfehl, wenn die Eingabe nicht innerhalb des vorgegebenen Speicherlimits dekomprimiert werden kann.Das Argument filters gibt die Filterkette an, die zum Erstellen des zu dekomprimierenden Streams verwendet wurde. Dieses Argument ist erforderlich, wenn format
FORMAT_RAWist, sollte aber für andere Formate nicht verwendet werden. Weitere Informationen zu Filterketten finden Sie unter Angabe benutzerdefinierter Filterketten.Hinweis
Diese Klasse behandelt keine Eingaben, die mehrere komprimierte Streams enthalten, transparent, im Gegensatz zu
decompress()undLZMAFile. Um eine Multi-Stream-Eingabe mitLZMADecompressorzu dekomprimieren, müssen Sie für jeden Stream einen neuen Dekomprimierer erstellen.- decompress(data, max_length=-1)¶
Dekomprimiert data (ein Byte-ähnliches Objekt) und gibt unkomprimierte Daten als Bytes zurück. Ein Teil von data kann intern gepuffert werden, für die Verwendung in späteren Aufrufen von
decompress(). Die zurückgegebenen Daten sollten mit der Ausgabe früherer Aufrufe vondecompress()verkettet werden.Wenn max_length nicht negativ ist, werden höchstens max_length Bytes dekomprimierter Daten zurückgegeben. Wenn diese Grenze erreicht ist und weitere Ausgaben erzeugt werden können, wird das Attribut
needs_inputaufFalsegesetzt. In diesem Fall kann der nächste Aufruf vondecompress()data alsb''übergeben, um mehr Ausgabe zu erhalten.Wenn alle Eingabedaten dekomprimiert und zurückgegeben wurden (entweder weil es weniger als max_length Bytes waren oder weil max_length negativ war), wird das Attribut
needs_inputaufTruegesetzt.Der Versuch, Daten nach Erreichen des Stream-Endes zu dekomprimieren, löst einen
EOFErroraus. Alle nach dem Stream-Ende gefundenen Daten werden ignoriert und im Attributunused_datagespeichert.Geändert in Version 3.5: Parameter max_length hinzugefügt.
- check¶
Die ID der Integritätsprüfung, die vom Eingabestream verwendet wird. Dies kann
CHECK_UNKNOWNsein, bis genügend der Eingabe dekodiert wurde, um zu bestimmen, welche Integritätsprüfung sie verwendet.
- eof¶
True, wenn die End-of-Stream-Markierung erreicht wurde.
- unused_data¶
Daten, die nach dem Ende des komprimierten Streams gefunden wurden.
Bevor das Stream-Ende erreicht ist, ist dies
b"".
- needs_input¶
False, wenn die Methodedecompress()mehr dekomprimierte Daten liefern kann, bevor neue unkomprimierte Eingaben erforderlich sind.Hinzugefügt in Version 3.5.
- lzma.compress(data, format=FORMAT_XZ, check=-1, preset=None, filters=None)¶
Komprimiert data (ein
bytes-Objekt) und gibt die komprimierten Daten alsbytes-Objekt zurück.Siehe
LZMACompressoroben für eine Beschreibung der Argumente format, check, preset und filters.
- lzma.decompress(data, format=FORMAT_AUTO, memlimit=None, filters=None)¶
Dekomprimiert data (ein
bytes-Objekt) und gibt die unkomprimierten Daten alsbytes-Objekt zurück.Wenn data die Verkettung mehrerer verschiedener komprimierter Streams ist, dekomprimiert alle diese Streams und gibt die Verkettung der Ergebnisse zurück.
Siehe
LZMADecompressoroben für eine Beschreibung der Argumente format, memlimit und filters.
Sonstiges¶
- lzma.is_check_supported(check)¶
Gibt
Truezurück, wenn die angegebene Integritätsprüfung auf diesem System unterstützt wird.CHECK_NONEundCHECK_CRC32werden immer unterstützt.CHECK_CRC64undCHECK_SHA256sind möglicherweise nicht verfügbar, wenn Sie eine Version von liblzma verwenden, die mit einem begrenzten Funktionsumfang kompiliert wurde.
Angabe benutzerdefinierter Filterketten¶
Ein Filterketten-Spezifizierer ist eine Sequenz von Dictionaries, wobei jedes Dictionary die ID und die Optionen für einen einzelnen Filter enthält. Jedes Dictionary muss den Schlüssel "id" enthalten und kann zusätzliche Schlüssel enthalten, um Filter-abhängige Optionen anzugeben. Gültige Filter-IDs sind wie folgt:
Kompressionfilter
FILTER_LZMA1(zur Verwendung mitFORMAT_ALONE)FILTER_LZMA2(zur Verwendung mitFORMAT_XZundFORMAT_RAW)
Delta-Filter
FILTER_DELTA
Branch-Call-Jump (BCJ)-Filter
FILTER_X86FILTER_IA64FILTER_ARMFILTER_ARMTHUMBFILTER_POWERPCFILTER_SPARC
Eine Filterkette kann aus bis zu 4 Filtern bestehen und nicht leer sein. Der letzte Filter in der Kette muss ein Kompressionsfilter sein, und alle anderen Filter müssen Delta- oder BCJ-Filter sein.
Kompressionfilter unterstützen die folgenden Optionen (angegeben als zusätzliche Einträge im Dictionary, das den Filter darstellt)
preset: Ein Kompressions-Preset, das als Quelle für Standardwerte für nicht explizit angegebene Optionen verwendet wird.dict_size: Dictionary-Größe in Bytes. Diese sollte zwischen 4 KiB und 1,5 GiB (einschließlich) liegen.lc: Anzahl der Literal-Kontext-Bits.lp: Anzahl der Literal-Positions-Bits. Die Summelc + lpdarf höchstens 4 betragen.pb: Anzahl der Positions-Bits; darf höchstens 4 betragen.mode:MODE_FASToderMODE_NORMAL.nice_len: Was als "nice length" für einen Treffer betrachtet werden soll. Dies sollte 273 oder weniger sein.mf: Welcher Match-Finder verwendet werden soll –MF_HC3,MF_HC4,MF_BT2,MF_BT3oderMF_BT4.depth: Maximale Suchtiefe, die vom Match-Finder verwendet wird. 0 (Standard) bedeutet automatische Auswahl basierend auf anderen Filteroptionen.
Der Delta-Filter speichert die Unterschiede zwischen Bytes und erzeugt unter bestimmten Umständen wiederholtere Eingaben für den Kompressor. Er unterstützt eine Option, dist. Dies gibt den Abstand zwischen den zu subtrahierenden Bytes an. Der Standardwert ist 1, d.h. die Unterschiede zwischen benachbarten Bytes werden berechnet.
Die BCJ-Filter sind für die Anwendung auf Maschinencode vorgesehen. Sie wandeln relative Sprünge, Aufrufe und Sprünge im Code in absolute Adressierung um, mit dem Ziel, die Redundanz zu erhöhen, die vom Kompressor ausgenutzt werden kann. Diese Filter unterstützen eine Option, start_offset. Diese gibt die Adresse an, die auf den Anfang der Eingabedaten abgebildet werden soll. Der Standardwert ist 0.
Beispiele¶
Lesen aus einer komprimierten Datei
import lzma
with lzma.open("file.xz") as f:
file_content = f.read()
Erstellen einer komprimierten Datei
import lzma
data = b"Insert Data Here"
with lzma.open("file.xz", "w") as f:
f.write(data)
Daten im Speicher komprimieren
import lzma
data_in = b"Insert Data Here"
data_out = lzma.compress(data_in)
Inkrementelle Komprimierung
import lzma
lzc = lzma.LZMACompressor()
out1 = lzc.compress(b"Some data\n")
out2 = lzc.compress(b"Another piece of data\n")
out3 = lzc.compress(b"Even more data\n")
out4 = lzc.flush()
# Concatenate all the partial results:
result = b"".join([out1, out2, out3, out4])
Schreiben komprimierter Daten in eine bereits geöffnete Datei
import lzma
with open("file.xz", "wb") as f:
f.write(b"This data will not be compressed\n")
with lzma.open(f, "w") as lzf:
lzf.write(b"This *will* be compressed\n")
f.write(b"Not compressed\n")
Erstellen einer komprimierten Datei mit einer benutzerdefinierten Filterkette
import lzma
my_filters = [
{"id": lzma.FILTER_DELTA, "dist": 5},
{"id": lzma.FILTER_LZMA2, "preset": 7 | lzma.PRESET_EXTREME},
]
with lzma.open("file.xz", "w", filters=my_filters) as f:
f.write(b"blah blah blah")