python3 zlib 实现压缩与解压字符串与文件数据流

本文详细介绍了Python中zlib模块的使用方法,包括如何压缩和解压字符串及数据流。通过具体代码案例展示了字符串的压缩与解压过程,以及如何处理文件传输中的数据流压缩与解压。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于python3 zlib 压缩解压情况总结如下:

  • 字符串:使用zlib.compress方法压缩字符串,使用zlib.decompress方法解压字符串。
  • 数据流:压缩:zlib.compressobj方法压缩数据流,解压:zlib.decompressobj方法压缩数据流。

其方法在python3.4手册中说明如下:

手册链接:点击打开链接

从中可以看出,对于python3来说,zlib.compress方法处理的对象为数据的bytes类型,而不是直接处理字符串!在方法中直接输入字符串错误如下:

代码案例:

import zlib
import requests

# zlib.compress 用来压缩字符串的bytes类型
def str_zlib():
    req = requests.get("http://python.jobbole.com/81513/")
    message = req.text
    bytes_message = str.encode(message)             # 采用爬虫的结果作为输入数据
    compressed = zlib.compress(bytes_message, zlib.Z_BEST_COMPRESSION)
    decompressed = zlib.decompress(compressed)      # str、repr的区别
    print("original string:", len(message))
    print("original bytes:",  len(bytes_message))
    print("compressed:",  len(compressed))
    print("decompressed:",  len(decompressed))

# zlib.compressobj 用来压缩数据流,用于文件传输
def file_compress(beginFile, zlibFile, level):
    infile = open(beginFile, "rb")
    zfile = open(zlibFile, "wb")
    compressobj = zlib.compressobj(level)   # 压缩对象
    data = infile.read(1024)                # 1024为读取的size参数
    while data:
        zfile.write(compressobj.compress(data))     # 写入压缩数据
        data = infile.read(1024)        # 继续读取文件中的下一个size的内容
    zfile.write(compressobj.flush())    # compressobj.flush()包含剩余压缩输出的字节对象,将剩余的字节内容写入到目标文件中

def file_decompress(zlibFile, endFile):
    zlibFile = open(zlibFile, "rb")
    endFile = open(endFile, "wb")
    decompressobj = zlib.decompressobj()
    data = zlibFile.read(1024)
    while data:
        endFile.write(decompressobj.decompress(data))
        data = zlibFile.read(1024)
    endFile.write(decompressobj.flush())

def main():
    # 测试字符串的压缩与解压
    str_zlib()
    
    # 测试数据流压缩
    beginFile = "./beginFile.txt"
    zlibFile = "./zlibFile.txt"
    level = 9
    file_compress(beginFile, zlibFile, level)

    # 测试数据流解压
    zlibFile = "./zlibFile.txt"
    endFile = "./endFile.txt"
    file_decompress(zlibFile, endFile)

if __name__=="__main__":
    main()

说明:

1. str与repr类型的区别参考:点击打开链接

2. 对于数据类型bytes参考:点击打开链接

3. 其中,对于compressobj方法来说,返回的是压缩对象,相比较compress方法,区别为:用于压缩一次无法放入内存的数据流(即分批次压缩)。

compressobj(level=-1method=DEFLATEDwbits=15memLevel=8strategy=Z_DEFAULT_STRATEGY)

主要参数如下:

  • level是压缩级别 - 一个从0到9的整数。值1是最快的方式但压缩效果不理想,而值9是最慢的方式但压缩效果最好。 0没有压缩。默认值是6。
  • wbits是窗口缓冲区大小的基本两倍对数。这是从8到15的整数。较高的值会提供更好的压缩效果,但会使用更多的内存。
  • memLevel参数控制用于内部压缩状态的内存量。有效值范围从1到9。较高的值使用更多的内存,但更快并产生较小的输出。

参考链接:

https://www.cnblogs.com/kaituorensheng/p/5448761.html 点击打开链接

https://docs.python.org/3/library/zlib.html 点击打开链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值