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.
运行结果: