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, bytes oder 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 eine io.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 LZMAFile kann 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 (als str, bytes oder Pfad-ähnliches Objekt). Beim Umschließen eines vorhandenen Datei-Objekts wird die umschlossene Datei nicht geschlossen, wenn die LZMAFile geschlossen 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.

LZMAFile unterstützt alle Mitglieder, die von io.BufferedIOBase spezifiziert werden, außer detach() und truncate(). Iteration und die with-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).

Hinweis

Während der Aufruf von peek() die Dateiposition des LZMAFile nicht ändert, kann er die Position des zugrunde liegenden Datei-Objekts ändern (z. B. wenn das LZMAFile durch Übergabe eines Datei-Objekts für filename konstruiert wurde).

mode

'rb' zum Lesen und 'wb' zum Schreiben.

Hinzugefügt in Version 3.13.

name

Der LZMA-Dateiname. Äquivalent zum Attribut name des 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 von None.

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_AUTO dekomprimiert werden (siehe LZMADecompressor).

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ür FORMAT_ALONE und FORMAT_RAW.

  • CHECK_CRC32: 32-Bit Cyclic Redundancy Check.

  • CHECK_CRC64: 64-Bit Cyclic Redundancy Check. Dies ist der Standardwert für FORMAT_XZ.

  • CHECK_SHA256: 256-Bit Secure Hash Algorithm.

Wenn die angegebene Prüfung nicht unterstützt wird, wird eine LZMAError ausgelö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 0 und 9 (einschließlich) sein, optional OR-verknüpft mit der Konstante PRESET_EXTREME. Wenn weder preset noch filters angegeben sind, ist das Standardverhalten die Verwendung von PRESET_DEFAULT (voreingestellte Stufe 6). 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 9 beispielsweise kann der Overhead für ein LZMACompressor-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 ein bytes-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 von compress() und flush(). Die zurückgegebenen Daten sollten mit der Ausgabe früherer Aufrufe von compress() verkettet werden.

flush()

Schließt den Komprimierungsprozess ab und gibt ein bytes-Objekt zurück, das alle Daten enthält, die sich in den internen Puffern des Komprimierers befinden.

Der Komprimierer kann nach dem Aufruf dieser Methode nicht mehr verwendet 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 sind FORMAT_XZ, FORMAT_ALONE und FORMAT_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 LZMAError fehl, 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_RAW ist, 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() und LZMAFile. Um eine Multi-Stream-Eingabe mit LZMADecompressor zu 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 von decompress() 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_input auf False gesetzt. In diesem Fall kann der nächste Aufruf von decompress() data als b'' ü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_input auf True gesetzt.

Der Versuch, Daten nach Erreichen des Stream-Endes zu dekomprimieren, löst einen EOFError aus. Alle nach dem Stream-Ende gefundenen Daten werden ignoriert und im Attribut unused_data gespeichert.

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_UNKNOWN sein, 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 Methode decompress() 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 als bytes-Objekt zurück.

Siehe LZMACompressor oben 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 als bytes-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 LZMADecompressor oben für eine Beschreibung der Argumente format, memlimit und filters.

Sonstiges

lzma.is_check_supported(check)

Gibt True zurück, wenn die angegebene Integritätsprüfung auf diesem System unterstützt wird.

CHECK_NONE und CHECK_CRC32 werden immer unterstützt. CHECK_CRC64 und CHECK_SHA256 sind 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 mit FORMAT_ALONE)

    • FILTER_LZMA2 (zur Verwendung mit FORMAT_XZ und FORMAT_RAW)

  • Delta-Filter

    • FILTER_DELTA

  • Branch-Call-Jump (BCJ)-Filter

    • FILTER_X86

    • FILTER_IA64

    • FILTER_ARM

    • FILTER_ARMTHUMB

    • FILTER_POWERPC

    • FILTER_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 Summe lc + lp darf höchstens 4 betragen.

  • pb: Anzahl der Positions-Bits; darf höchstens 4 betragen.

  • mode: MODE_FAST oder MODE_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_BT3 oder MF_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")