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)  

扩展阅读:

  1. Python桔子教程
  2. Python进阶教程m17b–压缩解压–gzip
  3. Python进阶教程m17–压缩解压–zipfile
### Python 中 `lzma` 模块的用途与用法 Python 的内置模块 `lzma` 提供了对 LZMA 和 XZ 压缩格式的支持。LZMA 是一种高效的无损数据压缩算法,广泛用于文件存档和传输场景中。以下是关于该模块的一些核心功能及其使用方法。 #### 1. 加载模块 要使用 `lzma` 模块,需先通过 `import` 关键字加载它: ```python import lzma ``` 此操作无需额外安装任何依赖项,因为它是 Python 标准库的一部分[^3]。 --- #### 2. 数据压缩 可以利用 `lzma.compress()` 方法来压缩原始数据流。下面是一个简单的例子: ```python data = b"This is a test string to demonstrate the use of lzma compression." compressed_data = lzma.compress(data) print(compressed_data) ``` 上述代码会返回经过 LZMA 算法处理后的二进制字符串形式的数据[^1]。 --- #### 3. 数据解压 对应的解压过程可以通过调用 `lzma.decompress()` 实现: ```python decompressed_data = lzma.decompress(compressed_data) print(decompressed_data.decode('utf-8')) ``` 这里需要注意的是,在打印解压后的内容之前可能需要将其转换回可读取的形式(如 UTF-8 字符串)。 --- #### 4. 使用上下文管理器打开 `.xz` 文件 除了直接操作内存中的数据外,还可以方便地读写磁盘上的 .xz 文件。例如创建一个新的压缩文件并写入内容: ```python with lzma.open("example.xz", "wb") as f: f.write(b"Sample content written into an XZ file.") ``` 同样也可以轻松读取已有的压缩文档: ```python with lzma.open("example.xz", "rb") as f: read_content = f.read() print(read_content.decode('utf-8')) ``` 这种方式不仅简化了资源分配逻辑还增强了程序的安全性和可靠性。 --- #### 5. 自定义参数设置 当执行更复杂的任务时,比如调整过滤器链或者指定特定编码选项,则需要用到高级配置接口。例如设定更高的压缩级别可以获得更好的比率但可能会牺牲速度性能: ```python filters = [ { 'id': lzma.FILTER_LZMA2, 'preset': 9 | lzma.PRESET_EXTREME, } ] custom_compressed_data = lzma.compress( data=data, format=lzma.FORMAT_XZ, check=lzma.CHECK_CRC64, filters=filters ) ``` 以上片段展示了如何构建自定义滤镜列表以及应用它们到实际工作中去。 --- #### 总结 综上所述,`lzma` 模块提供了强大而灵活的功能集用来满足各种类型的压缩需求。无论是简单的小型项目还是大型复杂应用程序都可以从中受益匪浅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值