Source

python-clinic / Doc / library / lzma.rst

Full commit

:mod:`lzma` --- Compression using the LZMA algorithm

This module provides classes and convenience functions for compressing and decompressing data using the LZMA compression algorithm. Also included is a file interface supporting the .xz and legacy .lzma file formats used by the :program:`xz` utility, as well as raw compressed streams.

The interface provided by this module is very similar to that of the :mod:`bz2` module. However, note that :class:`LZMAFile` is not thread-safe, unlike :class:`bz2.BZ2File`, so if you need to use a single :class:`LZMAFile` instance from multiple threads, it is necessary to protect it with a lock.

Reading and writing compressed files

Compressing and decompressing data in memory

Create a compressor object, which can be used to compress data incrementally.

For a more convenient way of compressing a single chunk of data, see :func:`compress`.

The format argument specifies what container format should be used. Possible values are:

  • :const:`FORMAT_XZ`: The .xz container format.

    This is the default format.

  • :const:`FORMAT_ALONE`: The legacy .lzma container format.

    This format is more limited than .xz -- it does not support integrity checks or multiple filters.

  • :const:`FORMAT_RAW`: A raw data stream, not using any container format.

    This format specifier does not support integrity checks, and requires that you always specify a custom filter chain (for both compression and decompression). Additionally, data compressed in this manner cannot be decompressed using :const:`FORMAT_AUTO` (see :class:`LZMADecompressor`).

The check argument specifies the type of integrity check to include in the compressed data. This check is used when decompressing, to ensure that the data has not been corrupted. Possible values are:

If the specified check is not supported, an :class:`LZMAError` is raised.

The compression settings can be specified either as a preset compression level (with the preset argument), or in detail as a custom filter chain (with the filters argument).

The preset argument (if provided) should be an integer between 0 and 9 (inclusive), optionally OR-ed with the constant :const:`PRESET_EXTREME`. If neither preset nor filters are given, the default behavior is to use :const:`PRESET_DEFAULT` (preset level 6). Higher presets produce smaller output, but make the compression process slower.

Note

In addition to being more CPU-intensive, compression with higher presets also requires much more memory (and produces output that needs more memory to decompress). With preset 9 for example, the overhead for an :class:`LZMACompressor` object can be as high as 800 MiB. For this reason, it is generally best to stick with the default preset.

The filters argument (if provided) should be a filter chain specifier. See :ref:`filter-chain-specs` for details.

Create a decompressor object, which can be used to decompress data incrementally.

For a more convenient way of decompressing an entire compressed stream at once, see :func:`decompress`.

The format argument specifies the container format that should be used. The default is :const:`FORMAT_AUTO`, which can decompress both .xz and .lzma files. Other possible values are :const:`FORMAT_XZ`, :const:`FORMAT_ALONE`, and :const:`FORMAT_RAW`.

The memlimit argument specifies a limit (in bytes) on the amount of memory that the decompressor can use. When this argument is used, decompression will fail with an :class:`LZMAError` if it is not possible to decompress the input within the given memory limit.

The filters argument specifies the filter chain that was used to create the stream being decompressed. This argument is required if format is :const:`FORMAT_RAW`, but should not be used for other formats. See :ref:`filter-chain-specs` for more information about filter chains.

Note

This class does not transparently handle inputs containing multiple compressed streams, unlike :func:`decompress` and :class:`LZMAFile`. To decompress a multi-stream input with :class:`LZMADecompressor`, you must create a new decompressor for each stream.

Miscellaneous

Specifying custom filter chains

A filter chain specifier is a sequence of dictionaries, where each dictionary contains the ID and options for a single filter. Each dictionary must contain the key "id", and may contain additional keys to specify filter-dependent options. Valid filter IDs are as follows:

A filter chain can consist of up to 4 filters, and cannot be empty. The last filter in the chain must be a compression filter, and any other filters must be delta or BCJ filters.

Compression filters support the following options (specified as additional entries in the dictionary representing the filter):

  • preset: A compression preset to use as a source of default values for options that are not specified explicitly.
  • dict_size: Dictionary size in bytes. This should be between 4 KiB and 1.5 GiB (inclusive).
  • lc: Number of literal context bits.
  • lp: Number of literal position bits. The sum lc + lp must be at most 4.
  • pb: Number of position bits; must be at most 4.
  • mode: :const:`MODE_FAST` or :const:`MODE_NORMAL`.
  • nice_len: What should be considered a "nice length" for a match. This should be 273 or less.
  • mf: What match finder to use -- :const:`MF_HC3`, :const:`MF_HC4`, :const:`MF_BT2`, :const:`MF_BT3`, or :const:`MF_BT4`.
  • depth: Maximum search depth used by match finder. 0 (default) means to select automatically based on other filter options.

The delta filter stores the differences between bytes, producing more repetitive input for the compressor in certain circumstances. It only supports a single The delta filter supports only one option, dist. This indicates the distance between bytes to be subtracted. The default is 1, i.e. take the differences between adjacent bytes.

The BCJ filters are intended to be applied to machine code. They convert relative branches, calls and jumps in the code to use absolute addressing, with the aim of increasing the redundancy that can be exploited by the compressor. These filters support one option, start_offset. This specifies the address that should be mapped to the beginning of the input data. The default is 0.

Examples

Reading in a compressed file:

import lzma
with lzma.open("file.xz") as f:
    file_content = f.read()

Creating a compressed file:

import lzma
data = b"Insert Data Here"
with lzma.open("file.xz", "w") as f:
    f.write(data)

Compressing data in memory:

import lzma
data_in = b"Insert Data Here"
data_out = lzma.compress(data_in)

Incremental compression:

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

Writing compressed data to an already-open file:

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

Creating a compressed file using a custom filter chain:

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