【Python标准库】LZ77编码和lzma模块
文章目录
- lz77编码
- lzma模块调用
lz77编码
Python标准库总共提供了三种压缩算法,分别是zlib
, bz2
以及lzma
,并且位这三个模块提供了高度相似的API,考虑到zlib
中已经对很多定义做了详尽的解读,本文主要介绍一下lzma
算法,然后对常用的函数做一个示例。
lzma
是Lempel-Ziv-Markov chain-Algorithm的缩写,在2001年被用在著名的7-Zip中,是在Deflate和LZ77算法上的改良和优化,本文主要介绍一下LZ77
算法。
LZ77
是L
empel和Z
iv在1977
年开发的编码方式,核心思想是利用数据的重复结构信息,从而弥补了霍夫曼编码需要了解先验频率的不足。
主要思路是用一个滑窗对数据进行筛选,其编码流程分为3步:
- 从当前压缩位置开始,用一个滑窗在已编码数据中查找与为编码数据据匹配的最长字符串,如果找到则跳到2,否则跳到3。
- 输出三元符号组
(off, L, c)
,其中off
位匹配字符串相对窗口边界的偏移,L
为匹配长度,c
为下一个字符。然后将窗口向后滑动L+1
个字符,继续步骤1。 - 输出单值
c
,c
为当前字符,然后将窗口向后滑动一个字符,继续步骤1。
以AABCBBABCD
为例,下面是LZ77
的编码流程
A
是第一个字母,再它出现之前,没有任何可供参考的编码数据,所以A
就是A
。- 第二个
A
就不一样了,由于有了第一个A
做参照,所以可以记作(1,1,B)
,前面的1表示此时滑窗移动1,第二个1表示长度为1,B
表示该字母之后是B
。至此,已经编码的区域为AAB
,记作A(1,1,B)
。 - 当前未编码的区域有
CBBABC
,C
无参照,所以直接记下来;B
在AAB
中有出现过,所以记作(3,1,B)
,2表示窗口向右滑动3位可匹配到B
,1表示匹配长度,B
表示第二个B
。此时已编码字符串为AABCBB
,记作A(1,1,B)C(2,1,B)
。 - 此时为编码区域有
ABC
,正好和AABC
中的ABC匹配,记作(2,3,D)
。
lzma模块调用
稍微讲解一下原理之后,可以先调用一下lzma
模块中最关键的两个函数compress
和decompress
。
import lzma
import sys
ori = 'ifyoumissthetrainimonyouwillknowthatiamgone'*10
bOri = ori.encode()
sys.getsizeof(bOri) # 463
c = lzma.compress(bOri)
sys.getsizeof(c) # 145
未采取压缩时,占内存463;压缩之后剩下145。
除了压缩和解压缩函数之外,lzma
还提供了直接与文件交互的open
,其封装为
lzma.open(filename, mode='rb', encoding=None, errors=None, newline=None)
lzma
模块提供了方便的文件交互函数open
,有了这个就可以直接将数据另存为压缩文件了
>>> with lzma.open('test.txt.xz', 'w') as f:
... f.write(ori.encode())
...
430
而且这个压缩文件可以直接用解压软件打开
既然能读,那自然能写
>>> with lzma.open('test.txt.xz', 'r') as f:
... print(f.read())
...
b'ifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgone'
【Python标准库】LZ77编码和lzma模块相关推荐
- Python标准库:一些受欢迎的模块
目录 1.模块sys 1).介绍 1.模块sys中一些重要的函数和变量 2.变量sys.argv 3.函数sys.exit 4.映射sys.modules 5.变量sys.path 6.变量sys.p ...
- 【Python标准库】pillow中Image模块学习
我是一个甜甜的大橙子
- Python标准库 (pickle包,cPickle包)
作者:Vamei 出处:http://www.cnblogs.com/vamei http://www.cnblogs.com/nju2014/p/5383992.html 在之前对Python对象的 ...
- python标准库学习笔记
原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...
- python链表库_[转]为什么python标准库没有实现链表
实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用. 如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常 ...
- 彻底弄懂Python标准库源码(一)—— os模块
目录 第1~22行 模块整体注释.nt与posix 第24~46行 模块引入._exists方法._get_exports_list方法 第48~97行 根据系统不同导入不同的方法和属性 第100~1 ...
- Python标准库:codecs【专门做编码转换】【open()、encode()、decode()、lookup()、getencoder()】【读写文件codecs.open()优于open()】
codecs专门用作编码转换,当我们要做编码转换的时候可以借助codecs很简单的进行编码转换 codecs模块提供一个open方法,三个参数encoding, errors, buffering,这 ...
- python标准库模块
06/07 20:10:08 编译 0.1. 关于本书 0.2. 代码约定 0.3. 关于例子 0.4. 如何联系我们 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. ...
- Python标准库queue模块原理浅析
Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...
最新文章
- 发布Web应用程序时发生的“xx.aspx.cs文件不存在”错误
- python读取文件模式_python如何读取文件的数据
- Graphviz:利用可视化工具Graphviz将dot数据进行图像可视化或者图像保存(两大方法)之详细攻略
- python--open用法
- python定义字体颜色_windows print 自定义字体颜色【python】
- java套接字客户端_使用Java从客户端套接字读取数据(Read data from a client socket in Java)...
- cocos2dx进阶学习之场景切换
- Bailian2742 Number of letters【入门】
- 开课吧Java教程什么是类集接口
- JEESZ分布式框架--单点登录集成方案
- 独角兽影视APP系统源码/双端影视APP源码
- php wind8.5,PHPWind 8.5 正式版源码下载
- 计算机主机总线,什么是计算机总线,计算机总线包括什么?
- 用JSON-server模拟REST API
- Java-Thread-Affinity框架使用及原理分析
- 收集45个实用的免费LOGO在线制作网站
- 如何正确计算导入Excel的行数(POI/NPOI)
- excel自动换行_你会用Excel制作 流程图 吗?
- Final Cut pro快捷键大全
- stp文件怎么变文件夹_PDPS教程之数模数据格式转换-stp文件怎么打开