关于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=-1, method=DEFLATED, wbits=15, memLevel=8, strategy=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 点击打开链接