lzma — Сжатие с использованием алгоритма LZMA
Добавлено в версии 3.3.
Исходный код: Lib/lzma.py
Этот модуль предоставляет классы и вспомогательные функции для сжатия и распаковки данных с помощью алгоритма сжатия LZMA. В него также входит файловый интерфейс, поддерживающий форматы файлов .xz и устаревший .lzma, используемые утилитой xz, а также необработанные сжатые потоки.
Интерфейс этого модуля очень похож на интерфейс модуля bz2. Обратите внимание, что LZMAFile и bz2.BZ2File не являются потокобезопасными, поэтому, если требуется использовать один экземпляр LZMAFile из нескольких потоков, необходимо защитить его блокировкой.
-
exception lzma.LZMAError -
Это исключение возникает при ошибке во время сжатия или распаковки либо при инициализации состояния компрессора/декомпрессора.
Чтение и запись сжатых файлов
-
lzma.open(filename, mode='rb', *, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None) -
Открывает файл, сжатый с помощью LZMA, в двоичном или текстовом режиме и возвращает файловый объект.
Аргумент filename может быть именем файла (заданным объектом
str,bytesили объектом, подобным пути), и в этом случае открывается указанный файл, либо существующим файловым объектом для чтения или записи.Аргумент mode может принимать значения
"r","rb","w","wb","x","xb","a"или"ab"для двоичного режима либо"rt","wt","xt"или"at"для текстового режима. По умолчанию используется"rb".При открытии файла для чтения аргументы format и filters имеют тот же смысл, что и для
LZMADecompressor. В этом случае аргументы check и preset использовать не следует.При открытии файла для записи аргументы format, check, preset и filters имеют тот же смысл, что и для
LZMACompressor.Для двоичного режима эта функция эквивалентна конструктору
LZMAFile:LZMAFile(filename, mode, ...). В этом случае аргументы encoding, errors и newline указывать нельзя.Для текстового режима создаётся объект
LZMAFile, который оборачивается экземпляромio.TextIOWrapperс указанной кодировкой, способом обработки ошибок и символом(-ами) конца строки.Изменено в версии 3.4: Добавлена поддержка режимов
"x","xb"и"xt".Изменено в версии 3.6: Принимает объект, подобный пути.
-
class lzma.LZMAFile(filename=None, mode='r', *, format=None, check=-1, preset=None, filters=None) -
Открывает файл, сжатый с помощью LZMA, в двоичном режиме.
Объект
LZMAFileможет оборачивать уже открытый файловый объект или работать непосредственно с файлом, указанным по имени. Аргумент filename задаёт файловый объект для обёртывания либо имя открываемого файла (объектstr,bytesили объект, подобный пути). При обёртывании существующего файлового объекта он не будет закрыт при закрытииLZMAFile.Аргумент mode может принимать значение
"r"для чтения (по умолчанию),"w"для перезаписи,"x"для создания только нового файла или"a"для добавления данных в конец файла. Им также соответствуют значения"rb","wb","xb"и"ab"соответственно.Если filename является файловым объектом, а не именем файла, режим
"w"не усекает файл, а вместо этого эквивалентен"a".При открытии файла для чтения входной файл может представлять собой объединение нескольких отдельных сжатых потоков. Они прозрачно декодируются как единый логический поток.
При открытии файла для чтения аргументы format и filters имеют тот же смысл, что и для
LZMADecompressor. В этом случае аргументы check и preset использовать не следует.При открытии файла для записи аргументы format, check, preset и filters имеют тот же смысл, что и для
LZMACompressor.LZMAFileподдерживает все методы и атрибуты, указанные вio.BufferedIOBase, за исключениемdetach()иtruncate(). Поддерживаются итерация и инструкцияwith.Также предоставляются следующие метод и атрибуты:
-
peek(size=-1) -
Возвращает буферизованные данные, не перемещая позицию в файле. Будет возвращён как минимум один байт данных, если не достигнут конец файла. Точное число возвращаемых байтов не определено (аргумент size игнорируется).
-
mode -
'rb'для чтения и'wb'для записи.Добавлено в версии 3.13.
-
name -
Имя файла lzma. Эквивалентно атрибуту
nameбазового файлового объекта.Добавлено в версии 3.13.
Изменено в версии 3.4: Добавлена поддержка режимов
"x"и"xb".Изменено в версии 3.5: Метод
read()теперь принимает аргумент типаNone.Изменено в версии 3.6: Принимает объект, подобный пути.
-
Сжатие и распаковка данных в памяти
-
class lzma.LZMACompressor(format=FORMAT_XZ, check=-1, preset=None, filters=None) -
Создаёт объект-компрессор, который можно использовать для последовательного сжатия данных.
Более удобный способ сжать один блок данных см. в описании
compress().Аргумент format задаёт используемый формат контейнера. Возможные значения:
-
-
FORMAT_XZ: The .xz container format. -
Это формат по умолчанию.
-
-
-
FORMAT_ALONE: The legacy .lzma container format. -
Этот формат более ограничен, чем
.xz: он не поддерживает проверки целостности и несколько фильтров.
-
-
-
FORMAT_RAW: A raw data stream, not using any container format. -
Этот спецификатор формата не поддерживает проверки целостности и требует всегда указывать пользовательскую цепочку фильтров (как для сжатия, так и для распаковки). Кроме того, данные, сжатые таким образом, нельзя распаковать с помощью
FORMAT_AUTO(см.LZMADecompressor).
-
Аргумент check задаёт тип проверки целостности, добавляемой к сжатым данным. Эта проверка используется при распаковке, чтобы убедиться, что данные не были повреждены. Возможные значения:
-
CHECK_NONE: проверка целостности не выполняется. Это значение используется по умолчанию (и является единственным допустимым) дляFORMAT_ALONEиFORMAT_RAW. -
CHECK_CRC32: 32-разрядная циклическая проверка избыточности. -
CHECK_CRC64: 64-разрядная циклическая проверка избыточности. Это значение по умолчанию дляFORMAT_XZ. -
CHECK_SHA256: 256-разрядный алгоритм безопасного хеширования.
Если указанная проверка не поддерживается, возникает исключение
LZMAError.Параметры сжатия можно задать либо как предустановленный уровень сжатия (с помощью аргумента preset), либо подробно — в виде пользовательской цепочки фильтров (с помощью аргумента filters).
Аргумент preset (если задан) должен быть целым числом от
0до9включительно, при необходимости объединённым оператором OR с константойPRESET_EXTREME. Если не заданы ни preset, ни filters, по умолчанию используетсяPRESET_DEFAULT(уровень предустановки6). Более высокие уровни предустановки дают меньший результат, но замедляют процесс сжатия.Примечание
Помимо повышенной нагрузки на процессор, сжатие с более высокими уровнями предустановки требует значительно больше памяти (а для распаковки полученного результата также требуется больше памяти). Например, при уровне предустановки
9накладные расходы для объектаLZMACompressorмогут достигать 800 МиБ. Поэтому обычно лучше использовать уровень предустановки по умолчанию.Аргумент filters (если задан) должен содержать спецификатор цепочки фильтров. Подробности см. в разделе Задание пользовательских цепочек фильтров.
-
compress(data) -
Сжимает data (объект
bytes) и возвращает объектbytes, содержащий сжатые данные как минимум для части входных данных. Часть data может буферизоваться внутри для использования при последующих вызовахcompress()иflush(). Возвращённые данные следует объединить с результатами всех предыдущих вызововcompress().
-
flush() -
Завершает процесс сжатия и возвращает объект
bytes, содержащий все данные, сохранённые во внутренних буферах компрессора.После вызова этого метода использовать компрессор нельзя.
-
-
class lzma.LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None) -
Создаёт объект-декомпрессор, который можно использовать для последовательной распаковки данных.
Более удобный способ распаковать весь сжатый поток за один раз см. в описании
decompress().Аргумент format задаёт используемый формат контейнера. По умолчанию используется
FORMAT_AUTO, который позволяет распаковывать файлы.xzи.lzma. Другие возможные значения:FORMAT_XZ,FORMAT_ALONEиFORMAT_RAW.Аргумент memlimit задаёт ограничение (в байтах) на объём памяти, который может использовать декомпрессор. Если задан этот аргумент и распаковать входные данные в пределах указанного ограничения памяти невозможно, возникает исключение
LZMAError.Аргумент filters задаёт цепочку фильтров, использованную для создания распаковываемого потока. Этот аргумент обязателен, если format равен
FORMAT_RAW, но его не следует использовать для других форматов. Дополнительные сведения о цепочках фильтров см. в разделе Задание пользовательских цепочек фильтров.Примечание
В отличие от
decompress()иLZMAFile, этот класс не обрабатывает прозрачно входные данные, содержащие несколько сжатых потоков. Чтобы распаковать входные данные из нескольких потоков с помощьюLZMADecompressor, необходимо создать новый декомпрессор для каждого потока.-
decompress(data, max_length=-1) -
Распаковывает data (объект типа bytes) и возвращает распакованные данные в виде байтов. Часть data может буферизоваться внутри для использования при последующих вызовах
decompress(). Возвращённые данные следует объединить с результатами всех предыдущих вызововdecompress().Если max_length неотрицателен, возвращается не более max_length байт распакованных данных. Если достигнут этот предел и можно получить дополнительные выходные данные, атрибут
needs_inputбудет установлен вFalse. В этом случае при следующем вызовеdecompress()в качестве data можно передатьb'', чтобы получить дополнительные выходные данные.Если все входные данные были распакованы и возвращены (либо их было меньше max_length байт, либо max_length было отрицательным), атрибут
needs_inputбудет установлен вTrue.Попытка распаковать данные после достижения конца потока вызывает исключение
EOFError. Все данные, обнаруженные после конца потока, игнорируются и сохраняются в атрибутеunused_data.Изменено в версии 3.5: Добавлен параметр max_length.
-
check -
Идентификатор проверки целостности, используемой входным потоком. До декодирования достаточного объёма входных данных, позволяющего определить используемую проверку целостности, значение может быть
CHECK_UNKNOWN.
-
eof -
True, если достигнут маркер конца потока.
-
unused_data -
Данные, обнаруженные после конца сжатого потока.
До достижения конца потока значение будет
b"".
-
needs_input -
False, если методdecompress()может предоставить дополнительные распакованные данные до необходимости получить новые входные данные.Добавлено в версии 3.5.
-
-
lzma.compress(data, format=FORMAT_XZ, check=-1, preset=None, filters=None) -
Сжимает data (объект
bytes) и возвращает сжатые данные в виде объектаbytes.Описание аргументов format, check, preset и filters см. выше в описании
LZMACompressor.
-
lzma.decompress(data, format=FORMAT_AUTO, memlimit=None, filters=None) -
Распаковывает data (объект
bytes) и возвращает распакованные данные в виде объектаbytes.Если data представляет собой объединение нескольких отдельных сжатых потоков, распаковываются все потоки, а результаты объединяются и возвращаются.
Описание аргументов format, memlimit и filters см. выше в описании
LZMADecompressor.
Разное
-
lzma.is_check_supported(check) -
Возвращает
True, если указанная проверка целостности поддерживается в этой системе.CHECK_NONEиCHECK_CRC32поддерживаются всегда.CHECK_CRC64иCHECK_SHA256могут быть недоступны, если используется версия liblzma, собранная с ограниченным набором возможностей.
Задание пользовательских цепочек фильтров
Спецификатор цепочки фильтров — это последовательность словарей, каждый из которых содержит идентификатор и параметры одного фильтра. Каждый словарь должен содержать ключ "id" и может содержать дополнительные ключи для задания параметров, зависящих от фильтра. Допустимые идентификаторы фильтров:
-
Фильтры сжатия:
-
FILTER_LZMA1(для использования сFORMAT_ALONE) -
FILTER_LZMA2(для использования сFORMAT_XZиFORMAT_RAW)
-
-
Фильтр разностей:
FILTER_DELTA
-
Фильтры Branch-Call-Jump (BCJ):
FILTER_X86FILTER_IA64FILTER_ARMFILTER_ARMTHUMBFILTER_POWERPCFILTER_SPARC
Цепочка может содержать до 4 фильтров и не может быть пустой. Последним фильтром в цепочке должен быть фильтр сжатия, а все остальные фильтры должны быть фильтрами разностей или BCJ.
Фильтры сжатия поддерживают следующие параметры (задаются как дополнительные элементы словаря, представляющего фильтр):
-
preset: предустановка сжатия, используемая как источник значений по умолчанию для параметров, заданных неявно. -
dict_size: размер словаря в байтах. Значение должно находиться в диапазоне от 4 КиБ до 1,5 ГиБ включительно. -
lc: число контекстных битов для литералов. -
lp: число позиционных битов для литералов. Суммаlc + lpдолжна быть не больше 4. -
pb: число позиционных битов; не должно превышать 4. -
mode:MODE_FASTилиMODE_NORMAL. -
nice_len: длина совпадения, считающаяся «хорошей». Значение должно быть не больше 273. -
mf: используемый алгоритм поиска совпадений —MF_HC3,MF_HC4,MF_BT2,MF_BT3илиMF_BT4. -
depth: максимальная глубина поиска, используемая алгоритмом поиска совпадений. Значение 0 (по умолчанию) означает автоматический выбор на основе других параметров фильтра.
Фильтр разностей сохраняет разности между байтами, что в определённых случаях делает входные данные более повторяющимися для компрессора. Он поддерживает один параметр — dist. Этот параметр задаёт расстояние между вычитаемыми байтами. По умолчанию оно равно 1, то есть вычисляются разности между соседними байтами.
Фильтры BCJ предназначены для применения к машинному коду. Они преобразуют относительные переходы, вызовы и переходы к меткам в коде в абсолютную адресацию, чтобы увеличить избыточность, которую может использовать компрессор. Эти фильтры поддерживают один параметр — start_offset. Он задаёт адрес, который должен соответствовать началу входных данных. По умолчанию используется 0.
Примеры
Чтение сжатого файла:
import lzma
with lzma.open("file.xz") as f:
file_content = f.read()
Создание сжатого файла:
import lzma
data = b"Insert Data Here"
with lzma.open("file.xz", "w") as f:
f.write(data)
Сжатие данных в памяти:
import lzma data_in = b"Insert Data Here" data_out = lzma.compress(data_in)
Последовательное сжатие:
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])
Запись сжатых данных в уже открытый файл:
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")
Создание сжатого файла с использованием пользовательской цепочки фильтров:
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")
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/lzma.html