使用 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 模块中的类和函数。