第八章:数据压缩与归档-gzip:读写GNU zip文件-处理流

8.2.3 处理流
GzipFile类可以用来包装其他类型的数据流,使它们也能使用压缩。通过一个套接字或一个现有的(已经打开的)文件句柄传输数据时,这种方法很有用。还可以对GzipFile使用BytesIO缓冲区,以对内存中数据完成操作。

import gzip
from io import BytesIO
import binascii

uncompressed_data = b'The same line,over and over.\n' * 10
print('UNCOMPRESSED:',len(uncompressed_data))
print(uncompressed_data)

buf = BytesIO()
with gzip.GzipFile(mode='wb',fileobj=buf) as f:
    f.write(uncompressed_data)

compressed_data = buf.getvalue()
print('COMPRESSED:',len(compressed_data))
print(binascii.hexlify(compressed_data))

inbuffer = BytesIO(compressed_data)
with gzip.GzipFile(mode='rb',fileobj=inbuffer) as f:
    reread_data = f.read(len(uncompressed_data))

print('\nREREAD:',len(reread_data))
print(reread_data)

使用GzipFile而不是zlib的一个好处是,GzipFile支持文件API。不过,重新读先前压缩的数据时,要向read()传递一个明确的长度。如果没有这个长度,则会导致一个CRC错误,这可能是因为BytesIO会在报告EOF之前返回一个空串。处理压缩数据流时,可以在数据前加一个整数作为前缀,表示要读取的具体数据量,也可以使用zlib中的增量解压缩API.
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值