Python压缩解压--lzma
原文链接:http://www.juzicode.com/python-tutorial-zip-unzip-lzma
本文介绍python的lzma模块压缩和解压缩文档,lzma和gzip一样也只能对单个文档进行压缩。
1、lzma.open()创建文件实例后压缩文件
lzma .open()方法会创建一个LZMAFile文件实例,第1个参数filename为gz文件的名称。参数mode为打开文件的模式,支持’r’, ‘rb’, ‘a’, ‘ab’, ‘w’, ‘wb’, ‘x’ or ‘xb’ (二进制方式)或者 ‘rt’, ‘at’, ‘wt’, or ‘xt’(文本模式),缺省为 ‘rb’,一般使用‘rb’读取,‘wb’创建文件。
下面这个例子中先用lzma .open()方法的’wb’模式创一个 LZMAFile文件实例,然后用rb模式从文件中读取数据,再用该文件实例的write()方法写入从文件中读取的数据,最后关闭文件实例:
#juzicode.com / VX:桔子code import lzma # 创建LZMAFile实例 zf = lzma.open('logo.png.xz', mode = 'wb') print('type(zf):',type(zf)) data = open('logo.png','rb').read() # 简化描述未关文件 zf.write(data) # 写文件 zf.close() # 关闭
运行结果:
type(zf): <class 'lzma.LZMAFile'>
2、lzma.compress()压缩数据后写文件
另外一种方法是用lzma.comress()方法将从文件中读出的数据进行压缩,再将压缩后的数据写入到文件中,这种方法也与gzip类似。
#juzicode.com / VX:桔子code import lzma pf = open('logo3.png.xz', 'wb') # open方法创建普通文件对象 data = open('logo.png','rb').read() # 简化描述未关文件 data_comp = lzma.compress(data) # 压缩数据 pf.write(data_comp) # 写文件 pf.close() # 关闭
或者使用更简便、更安全的文件打开方式:
import lzma with open('zipspec.txt.xz', 'wb') as pw, open('zipspec.txt','rb') as pr: pw.write(lzma.compress(pr.read()) )
3、xz和lzma文件格式
当使用lzma.open()方法创建文件实例时,不同的format入参会使用不同的压缩算法,FORMAT_XZ使用LZMA2算法,FORMAT_ALONE使用更早版本的LZMA算法:
#juzicode.com / VX:桔子code import lzma data = open('zipspec.txt','rb').read() # 简化描述未关文件 #xz格式 zf1 = lzma.open('zipspec.txt.xz', mode = 'wb', format = lzma.FORMAT_XZ) zf1.write(data) # 写文件 zf1.close() # 关闭 #lzma格式 zf2 = lzma.open('zipspec2.txt.lzma', mode = 'wb', format = lzma.FORMAT_ALONE) zf2.write(data) # 写文件 zf2.close() # 关闭
运行结果:
从生成的压缩文件中可以看到使用算法的差异。
4、解压缩文件
前面压缩文件的过程反过来使用就能完成文件的解压缩。
第1种方法是用lzma.open()的mode=’rb’读方式创建压缩文件实例zf,然后用普通的open()写方式创建解压文件实例pw,然后用zf.read()方法读出解压缩的数据data,这个过程会自动完成压缩文档的解压;再用pw写入data完成解压缩文件的写入。
#juzicode.com / VX:桔子code import lzma zip_filename = 'logo.png.xz' with open('unzip\\logo1.png','wb') as pw: zf = lzma.open(zip_filename, mode = 'rb') #打开压缩文件 data=zf.read() # 解压文件 pw.write(data) # 写解压缩文件 zf.close()
第2种方法是用普通的open()读方式创建压缩文件实例pr,用普通的open()写方式创建解压缩文件实例pw;再用pr.read()方法读出数据data,这时数据仍然是压缩状态;然后用lzma.decompress(data)方法解压数据生成data_dec,最后用pw.write( data_dec )方法写入解压后的数据,
#juzicode.com / VX:桔子code import lzma zip_filename = 'logo.png.xz' with open(zip_filename, 'rb') as pr, open('unzip\\logo3.png','wb') as pw: data = pr.read() data_dec = lzma.decompress(data) pw.write(data_dec)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)