文章目录

  • lz77编码
  • lzma模块调用

lz77编码

Python标准库总共提供了三种压缩算法,分别是zlib, bz2以及lzma,并且位这三个模块提供了高度相似的API,考虑到zlib中已经对很多定义做了详尽的解读,本文主要介绍一下lzma算法,然后对常用的函数做一个示例。

lzma是Lempel-Ziv-Markov chain-Algorithm的缩写,在2001年被用在著名的7-Zip中,是在Deflate和LZ77算法上的改良和优化,本文主要介绍一下LZ77算法。

LZ77Lempel和Ziv在1977年开发的编码方式,核心思想是利用数据的重复结构信息,从而弥补了霍夫曼编码需要了解先验频率的不足。

主要思路是用一个滑窗对数据进行筛选,其编码流程分为3步:

  1. 从当前压缩位置开始,用一个滑窗在已编码数据中查找与为编码数据据匹配的最长字符串,如果找到则跳到2,否则跳到3。
  2. 输出三元符号组(off, L, c),其中off位匹配字符串相对窗口边界的偏移,L为匹配长度,c为下一个字符。然后将窗口向后滑动L+1个字符,继续步骤1。
  3. 输出单值cc为当前字符,然后将窗口向后滑动一个字符,继续步骤1。

AABCBBABCD为例,下面是LZ77的编码流程

  1. A是第一个字母,再它出现之前,没有任何可供参考的编码数据,所以A就是A
  2. 第二个A就不一样了,由于有了第一个A做参照,所以可以记作(1,1,B),前面的1表示此时滑窗移动1,第二个1表示长度为1,B表示该字母之后是B。至此,已经编码的区域为AAB,记作A(1,1,B)
  3. 当前未编码的区域有CBBABCC无参照,所以直接记下来;BAAB中有出现过,所以记作(3,1,B),2表示窗口向右滑动3位可匹配到B,1表示匹配长度,B表示第二个B。此时已编码字符串为AABCBB,记作A(1,1,B)C(2,1,B)
  4. 此时为编码区域有ABC,正好和AABC中的ABC匹配,记作(2,3,D)

lzma模块调用

稍微讲解一下原理之后,可以先调用一下lzma模块中最关键的两个函数compressdecompress

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模块相关推荐

  1. Python标准库:一些受欢迎的模块

    目录 1.模块sys 1).介绍 1.模块sys中一些重要的函数和变量 2.变量sys.argv 3.函数sys.exit 4.映射sys.modules 5.变量sys.path 6.变量sys.p ...

  2. 【Python标准库】pillow中Image模块学习

    我是一个甜甜的大橙子

  3. Python标准库 (pickle包,cPickle包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei http://www.cnblogs.com/nju2014/p/5383992.html 在之前对Python对象的 ...

  4. python标准库学习笔记

    原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...

  5. python链表库_[转]为什么python标准库没有实现链表

    实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用. 如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常 ...

  6. 彻底弄懂Python标准库源码(一)—— os模块

    目录 第1~22行 模块整体注释.nt与posix 第24~46行 模块引入._exists方法._get_exports_list方法 第48~97行 根据系统不同导入不同的方法和属性 第100~1 ...

  7. Python标准库:codecs【专门做编码转换】【open()、encode()、decode()、lookup()、getencoder()】【读写文件codecs.open()优于open()】

    codecs专门用作编码转换,当我们要做编码转换的时候可以借助codecs很简单的进行编码转换 codecs模块提供一个open方法,三个参数encoding, errors, buffering,这 ...

  8. python标准库模块

    06/07 20:10:08 编译 0.1. 关于本书 0.2. 代码约定 0.3. 关于例子 0.4. 如何联系我们 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. ...

  9. Python标准库queue模块原理浅析

    Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...

最新文章

  1. 发布Web应用程序时发生的“xx.aspx.cs文件不存在”错误
  2. python读取文件模式_python如何读取文件的数据
  3. Graphviz:利用可视化工具Graphviz将dot数据进行图像可视化或者图像保存(两大方法)之详细攻略
  4. python--open用法
  5. python定义字体颜色_windows print 自定义字体颜色【python】
  6. java套接字客户端_使用Java从客户端套接字读取数据(Read data from a client socket in Java)...
  7. cocos2dx进阶学习之场景切换
  8. Bailian2742 Number of letters【入门】
  9. 开课吧Java教程什么是类集接口
  10. JEESZ分布式框架--单点登录集成方案
  11. 独角兽影视APP系统源码/双端影视APP源码
  12. php wind8.5,PHPWind 8.5 正式版源码下载
  13. 计算机主机总线,什么是计算机总线,计算机总线包括什么?
  14. 用JSON-server模拟REST API
  15. Java-Thread-Affinity框架使用及原理分析
  16. 收集45个实用的免费LOGO在线制作网站
  17. 如何正确计算导入Excel的行数(POI/NPOI)
  18. excel自动换行_你会用Excel制作 流程图 吗?
  19. Final Cut pro快捷键大全
  20. stp文件怎么变文件夹_PDPS教程之数模数据格式转换-stp文件怎么打开

热门文章

  1. Vue.js实现文字超出指定高度后展开收起功能
  2. Scala 之 并行计算
  3. UVa Problem 109 - SCUD Busters
  4. Scrapy: Feed exports
  5. 4款电子书制作工具比拼
  6. 使用VirtualBox在PC上安装Android OS
  7. 机器人编程常用的四大语言
  8. 深圳思泉雷文成:赚不到钱,就去赚商誉
  9. VS2013+OBS开发
  10. mysql 中日韩 乱码_mysql字符集及乱码问题