使用 Python (lzma) 进行 LZMA 算法压缩


**Lempel-Ziv-Markov 链算法**(LZMA) 使用字典压缩方案执行无损数据压缩,其压缩率高于其他压缩算法。Python 的 lzma 模块包含用于使用 LZMA 算法压缩和解压缩数据的类和便捷函数。

虽然此模块中的功能类似于 bz2 模块,但与 BZ2File 类相比,LZMAFile 类不是线程安全的。

同样,lzma 模块中的 open() 函数是打开 lzma 压缩文件对象的非常简单的方法。

open()

此函数打开一个 LZMA 压缩文件并返回一个文件对象。该函数需要两个主要参数——文件名和模式。模式参数默认为“rb”,但可以采用以下任何值

binary mode - "r", "rb", "w", "wb", "x", "xb", "a" or "ab"
text mode - "rt", "wt", "xt", or "at"

compress()

此函数使用 LZMA 算法压缩给定数据并返回一个字节对象。此函数可以选择具有一个格式参数,该参数决定容器格式。可能的值为 FORMAT_XZ(默认值)和 FORMAT_ALONE。

decompress()

此函数解压缩数据并返回未压缩的字节对象。

以上函数在以下示例中使用。要将 LZMA 压缩数据写入文件

>>> import lzma
>>> data = b"Welcome to TutorialsPoint"
>>> f = lzma.open("test.xz","wb")
>>>f.write(data)
>>>f.close()

将在当前工作目录中创建一个“test.xz”文件。要从该文件获取未压缩的数据,请使用以下代码。

>>> import lzma
>>> f = lzma.open("test.xz","rb")
>>> data = f.read()
>>> data
b'Welcome to TutorialsPoint'

要使用 lzma 模块的面向对象 API 执行压缩,我们必须使用 LZMAFile 类

LZMAFile()

这是 LZMAFile 类的构造函数。它需要指定文件和模式。具有“w”或“wb”模式的对象使其可使用 write() 方法。

write()

此方法压缩给定数据并将其写入其下方的文件。

>>> data = b'Welcome to TutorialsPoint'
>>>obj = lzma.LZMAFile("test.xz", mode="wb")
>>>obj.write(data)
>>>obj.close()

压缩文件被读取,并且使用以 mode='rb' 参数创建的 LZMAFile 对象的 read() 方法检索未压缩的数据。

read()

此方法从压缩文件读取数据并返回未压缩的数据。

>>>obj = lzma.LZMAFile("test.xz", mode="rb")
>>> data=obj.read()
>>> data
b'Welcome to TutorialsPoint'

LZMA 算法也允许将压缩数据写入已打开的文件。在以下示例中,“test.txt”以“wb”模式正常打开(使用内置的 open() 函数),并向其中写入一些文本。之后,使用相同的文件写入压缩数据。

>>> f = open("test.txt","wb")
>>>f.write(b"Hello world")
>>>fp = lzma.open(f,"wb")
>>>fp.write(b"Welcome to Python")
>>>f.write(b"Thank you")
>>>f.close()
>>>fp.flush()
>>>fp.close()

执行上述代码后,“test.txt”将出现在当前目录中。它包含如下所示的压缩和未压缩数据的混合。

Hello worldý7zXZ æÖ´F!t/å£Thank you

与 bz2 模块一样,lzma 模块也具有增量压缩器和解压缩器类。

LZMACompressor()

这是一个构造函数,它返回增量压缩器对象。多个块可以单独压缩,并将它们的连接数据写入文件

compress()

此方法压缩给定数据并返回字节对象

flush()

此方法清空缓冲区并返回一个字节对象。

以下示例使用增量压缩器对象压缩列表对象。

>>> data = [b'Hello World', b'How are you?', b'welcome to Python']
>>> obj = lzma.LZMACompressor()
>>> bindata = []
>>> for i in data:
bindata.append(obj.compress(i))
>>> bindata.append(obj.flush())
>>> bindata
[b'\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3', b'', b'', b"\x01\x00'Hello WorldHow are you?welcome to Python\x00\xf5\xc6\xc1d|\xf3\x8ey\x00\x01@(\xd4RJ\xe5\x1f\xb6\xf3}\x01\x00\x00\x00\x00\x04YZ"]

上述代码构建 bindata 作为原始列表中每个项目的压缩字节表示的列表。要使用**LZMADecompressor**对象检索未压缩的数据,请使用以下语句

>>> obj = lzma.LZMADecompressor()
>>> binstr = b''.join(bindata)
>>> obj.decompress(binstr)
b'Hello WorldHow are you?welcome to Python'

本文通过示例解释了 lzma 模块中的类和函数。

更新于: 2020-06-26

4K+ 次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告