8.3.5 读压缩文件
要从之前压缩的文件读回数据,需要用读模式(‘rb’)打开文件。从read()返回的值是一个字节串。
import bz2
import io
with bz2.BZ2File('example.bz2','rb') as input:
with io.TextIOWrapper(input,encoding='utf-8') as dec:
print(dec.read())
这个例子读取上一节bz2_file_write.py所写的文件。BZ2File用一个TextIOWrapper包装,将所读取的字节解码为Unicode文本。
运行结果:
Contents of the example file go here.
读文件时,还可以用seek()定位,然后只读取部分数据。
import bz2
import contextlib
with bz2.BZ2File('example.bz2','rb') as input:
print('Entire file:')
all_data = input.read()
print(all_data)
expected = all_data[5:15]
# Rewind to beginning
input.seek(0)
# Move ahead 5 bytes
input.seek(5)
print('Starting at position 5 for 10 bytes:')
partial = input.read(10)
print(partial)
print()
print(expected == partial)
seek()位置是相对未压缩数据的位置,所以调用者并不需要知道数据文件是压缩文件。这就允许将一个BZ2File实例传入一个原本接收常规未压缩文件的函数。
运行结果: