Lempel-谢夫马尔可夫链算法使用设有比其它压缩算法更高的压缩比的字典压缩方案(LZMA)执行无损数据压缩。Python的lzma模块由用于通过LZMA算法压缩和解压缩数据的类和便利函数组成。
尽管此模块中的功能类似于bz2模块,但是与BZ2File类相比,LZMAFile类不是线程安全的。
同样,open()
lzma模块中的函数是打开lzma压缩文件对象的最简单方法。
此函数将打开LZMA压缩文件并返回文件对象。该功能需要两个主要参数-文件名和模式。默认情况下,模式参数为“ rb”,但可以采用以下任何值
binary mode - "r", "rb", "w", "wb", "x", "xb", "a" or "ab" text mode - "rt", "wt", "xt", or "at"
此函数使用LZMA算法压缩给定数据,并返回一个字节对象。该函数可以选择使用一个格式参数来决定容器的格式。可能的值为FORMAT_XZ(默认值)和FORMAT_ALONE。
此函数解压缩数据并返回未压缩的字节对象。
在以下示例中使用上述功能。将LZMA压缩数据写入文件
>>> import lzma >>> data = b"Welcome to nhooo" >>> 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 nhooo'
要使用lzma模块的面向对象的API执行压缩,我们必须使用LZMAFile类
这是LZMAFile类的构造函数。它要求指定文件和模式。具有“ w”或“ wb”模式的对象使write()
方法可用。
此方法压缩给定的数据并将其写入其下面的文件中。
>>> data = b'Welcome to nhooo' >>>obj = lzma.LZMAFile("test.xz", mode="wb") >>>obj.write(data) >>>obj.close()
通过read()
使用mode ='rb'参数创建的LZMAFile对象的方法,读取压缩文件,并检索未压缩数据。
此方法从压缩文件中读取数据并返回未压缩的数据。
>>>obj = lzma.LZMAFile("test.xz", mode="rb") >>> data=obj.read() >>> data b'Welcome to nhooo'
LZMA算法还允许将压缩数据写入已经打开的文件。在下面的示例中,“ test.txt”open()
以“ wb”模式正常打开(使用内置功能),并且向其中写入了一些文本。之后,使用同一文件来写入压缩数据。
>>> 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模块也具有增量压缩器和解压缩器类。
这是一个返回增量压缩器对象的构造函数。可以单独压缩多个块,并将它们的连接数据写入文件
此方法压缩给定数据并返回字节对象
此方法清空缓冲区并返回一个字节对象。
下面的示例使用增量压缩器对象压缩列表对象。
>>> 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模块中的类和函数。