Модуль lzma
предоставляет классы и вспомогательные функции для сжатия и распаковки данных с использованием алгоритма сжатия LZMA. Также включен файловый интерфейс, поддерживающий форматы файлов .xz
и .lzma
, используемые bash утилитой xz
, а также необработанные сжатые потоки.
Интерфейс, предоставляемый этим модулем, очень похож на интерфейс модуля bz2
. Однако обратите внимание, что lzma.LZMAFile
не является потокобезопасным, в отличие от bz2.BZ2File
, поэтому, если необходимо использовать один экземпляр lzma.LZMAFile
из нескольких потоков, необходимо защитить его с помощью блокировки.
Создание сжатого файла:
import lzma data = b"Insert Data Here" with lzma.open("file.xz", "w") as f: f.write(data)
Чтение в сжатого файла:
import lzma with lzma.open("file.xz") as f: file_content = f.read()
Сжатие данных в памяти:
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 fp: with lzma.open(fp, "w") as lzf: lzf.write("Эти данные будут сжаты\n".encode('utf-8')) fp.write("Эти данные будут не сжаты\n".encode('utf-8'))
Создание сжатого файла с использованием пользовательской цепочки фильтров:
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 fp: fp.write(b"blah blah blah")