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)¶ Возвращает буферизованные данные без продвижения позиции файла. По крайней мере один байт данных будет возвращенный, если не достигнуто значение EOF. Точное число байтов возвращенный не указано (аргумент size игнорируется).
Изменено в версии 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
: формат контейнера.xz
. Это формат по умолчанию.FORMAT_ALONE
: наследование формат контейнера.lzma
. Этот формат более ограничен, чем.xz
- он не поддерживает проверки целостности или несколько фильтров.FORMAT_RAW
: поток необработанных данных, не использующий формат контейнера. Этот спецификатор формата не поддерживает проверки целостности и требует, чтобы всегда указывалась пользовательская цепочка фильтров (как для сжатия, так и для распаковки). Кроме того, данные, сжатые таким образом, не могут быть распакованы с использованиемFORMAT_AUTO
(см.LZMADecompressor
).
Аргумент check указывает тип проверки целостности для включения в сжатые данные. Эта проверка - используемый, развертывая, чтобы гарантировать, что данные не были испорчены. Возможный значения are:
CHECK_NONE
: проверка целостности отсутствует. Это - дефолт (и единственный приемлемый значение) дляFORMAT_ALONE
иFORMAT_RAW
.CHECK_CRC32
: 32-разрядная проверка циклическим избыточностью.CHECK_CRC64
: 64-разрядная проверка циклическим избыточностью. Это значение по умолчанию дляFORMAT_XZ
.CHECK_SHA256
: 256-битный алгоритм безопасного хэша.
Если указанная проверка не поддержана,
LZMAError
поднят.Параметры сжатия могут быть заданы либо в виде предустановленного уровня сжатия (с аргументом preset), либо подробно в виде пользовательской цепочки фильтров (с аргументом filters).
Аргумент preset (если он указан) должен быть целым числом между
0
и9
(включительно), необязательно ИЛИ с константойPRESET_EXTREME
. Если ни preset, ни filters не заданы, по умолчанию используется поведениеPRESET_DEFAULT
(предустановленный уровень6
). Более высокие настройки дают меньший выход, но делают процесс сжатия более медленным.Примечание
В дополнение к более интенсивным процессорам, сжатие с более высокими установками также требует гораздо больше памяти (и производит выходные данные, которые требуют больше памяти для распаковки). С заданным
9
, например, верхними для объектаLZMACompressor
могут быть целых 800 MiB. По этой причине обычно лучше придерживаться предустановки по умолчанию.Аргумент filters (если он указан) должен быть спецификатором цепочки фильтров. Дополнительные сведения см. в разделе Задание пользовательских цепочек фильтров.
-
compress
(data)¶ Сжать data (объект
bytes
), возвращая объектbytes
, содержащий сжатые данные, по крайней мере, для части входных данных. Некоторые из data могут быть буферизированы внутри системы для использования в последующих вызовахcompress()
иflush()
. Данные возвращенный должны конкатенироваться с выходными данными всех предыдущих вызововcompress()
.
-
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 (байтоподобный объект), возвращая несжатые данные в байтах. Некоторые из 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
.См.
LZMACompressor
выше для описания format, check, preset и аргументов filters.
-
lzma.
decompress
(data, format=FORMAT_AUTO, memlimit=None, filters=None)¶ Распакуйте data (объект
bytes
), возвращая несжатые данные как объектbytes
.Если data является конкатенацией множества различных сжатых потоков, распакуйте все эти потоки и возвращает конкатенацию результатов.
См.
LZMADecompressor
выше для описания format, memlimit и аргументов filters.
Разное¶
-
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
)
- Фильтр Delta:
FILTER_DELTA
- Фильтры Branch-Call-Jump (BCJ):
FILTER_IA64
FILTER_ARM
FILTER_ARMTHUMB
FILTER_POWERPC
FILTER_SPARC
Цепочка фильтров может состоять из до 4 фильтров и не может быть пустой. Последним фильтром в цепочке должен быть фильтр сжатия, а любыми другими фильтрами - дельта или BCJ.
Фильтры сжатия поддерживают следующие параметры (указанные как дополнительные статьи в словаре, представляющем фильтр):
preset
: стиль сжатия, используемый в качестве источника значения по умолчанию для параметров, которые не указаны явно.dict_size
: размер словаря в байтах. Это должно быть между 4 KiB и 1,5 GiB (включительно).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()
# Объединить все частичные результаты:
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")