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

关于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 点击打开链接

猜你喜欢

转载自blog.csdn.net/HeyShHeyou/article/details/79894002