Python3 压缩与解压缩(zlib / gzip / bz2 / lzma / zipfile / tarfile)
本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.youkuaiyun.com/Rozol/article/details/72672703
以下代码以Python3.6.1为例
Less is more!
文件的归档 (各种格式的压缩 / 解压缩)
实际使用中仅需要使用shutil模块的压缩和解压函数就可以了, 如果想尝试其他功能, zipfile(暴力破解), tarfile(命令行)也是值得推荐的
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/21'
# filscondense.py 文件的归档 (各种格式的压缩 / 解压缩)
# 实际使用中仅需要使用shutil模块的压缩和解压函数就可以了, 如果想尝试其他功能, zipfile(暴力破解), tarfile(命令行)也是值得推荐的
import zlib
def zlib_demo():
# 对直接进行压缩
data = b'luzhuo.me'
com_bytes = zlib.compress(data)
print("压缩后的数据: ", com_bytes)
decom_bytes = zlib.decompress(com_bytes)
print("解压后的数据: ", decom_bytes)
# 对数据流进行压缩
with open("file.txt", "rb") as read, open("com.txt", "wb") as write:
com = zlib.compressobj(level=9, memLevel=9)
for data in read:
# 压缩数据并写入文件
write.write(com.compress(data))
write.write(com.flush())
# 对数据流进行解压
with open("com.txt", "rb") as read, open("temp.txt", "wb") as write:
decom = zlib.decompressobj()
for data in read:
write.write(decom.decompress(data))
write.write(decom.flush())
def zlib_func():
'''
zlib
'''
# zlib.adler32(data[, value]) // 计算数据的Adler-32校验和(比CRC32快), value:校验和的起始值(默认1)
num = zlib.adler32(b"luzhuo.me")
# zlib.crc32(data[, value]) // 计算数据的CRC(循环冗余校验)校验和, value:校验和的起始值,默认0
num = zlib.crc32(b"luzhuo.me")
# zlib.compress(data[, level]) // 压缩字节数据,返回压缩后的字节, level:[0,9],0:无压缩,1最小压缩,9最高压缩, 默认:6
bytes = zlib.compress(b"luzhuo.me")
# zlib.decompress(data[, wbits[, bufsize]]) // 解压缩, wbits:历史缓冲区(默认:15), bufsize:保存解压数据的缓冲区(默认:16384)
bytes = zlib.decompress(bytes)
# 压缩对象 level:压缩级别[0,9], method:压缩算法(DEFLATED), wbits:历史缓冲区大小,值越大,压缩效果更好(注:使用默认值), memLevel:内存量[1,9],值越大,效果更好更快
# strategy:策略 Z_DEFAULT_STRATEGY / Z_FILTERED / Z_HUFFMAN_ONLY, zdict:压缩字典(预期频繁出现的字节序列)
# zlib.compressobj(level=-1, method=DEFLATED, wbits=15, memLevel=8, strategy=Z_DEFAULT_STRATEGY[, zdict])
com = zlib.compressobj(level=9, memLevel=9)
# zlib.decompressobj(wbits=15[, zdict]) // 解压缩对象
decom = zlib.decompressobj()
strs = zlib.ZLIB_VERSION # zlib版本
strs = zlib.ZLIB_RUNTIME_VERSION # 解释器运行的zlib版本
# 压缩对象
com_data = com.compress(b"luzhuo.me") # 压缩数据
# Compress.flush([mode]) // 完成剩余压缩数据的字节对象, mode:Z_SYNC_FLUSH(可进步压缩) / Z_FULL_FLUSH(可进步压缩) / Z_FINISH(完成压缩)
data = com.flush()
com.copy() # 拷贝压缩对象副本
# 解压缩对象
# Decompress.decompress(data[, max_length]) // 解压
data = decom.decompress(data)
decom.unused_data # 将要解压的数据
decom.unconsumed_tail # 未解压的数据
decom.eof # 数据流是否已结束
decom.flush() # 完成压缩, 无法再次解压, length:缓冲区大小
decom.copy()
# 异常
try: pass
except zlib.error: pass # 压缩和解压缩错误而引发的异常
if __name__ == "__main__":
zlib_demo()
# zlib_func()
# ==================================
import gzip
import shutil
content = b"luzhuo.me"
def gzip_demo():
# 类字节对象的压缩与解压
# 压缩
bytes_com = gzip.compress(content)
print("字节压缩: ", bytes_com)
bytes_decom = gzip.decompress(bytes_com)
print("字节解压: ", bytes_decom)
# 对gzip文件的读写操作
# 写入
with gzip.open('box.gz', 'wb')