我有一个文件,我需要通过chunk读取内存块并压缩它。
为此我使用的是Zlib库。此库使用方法compressobj()
提供流选项。
def read_in_chunks(file_object, chunk_size=1024*2):
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
def compress_chunks(gen_obj):
for i in gen_obj:
compress = zlib.compressobj(2, zlib.DEFLATED, -15)
compressed_data = compress.compress(i)+compress.flush()
yield (compressed_data)
if __name__ == '__main__':
test_data = open('test.txt','rb')
chunk_input = read_in_chunks(test_data)
compressed_data = compress_chunks(chunk_input)
with open('test_zip_file.dat','wb') as ff:
for d in compressed_data:
ff.write(d)
f.close()
使用上面的代码,我能够以压缩方式将文件写回文件。
但要阅读它我能够遵循相同的程序。
我需要将数据块读回内存解压缩并写回文件。
我在解压缩块中的对象时面临以下问题
1)zlib: Error -3 while decompressing data: invalid distance too far back
:
当我尝试为每个块添加zlib.decompress.flush()
2)Loss of data
:
当我没有为每个块创建新对象并尝试将其解压缩为多个块时,我得到一个空白字符串并获得比原始文件更少的数据。
def read_in_chunks(file_object, chunk_size=1024*2):
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
def decompress_chunks(gen_obj):
decom = zlib.decompressobj(-15)
for i in gen_obj:
decom_data = decom.decompress(i)
yield(decom_data)
if __name__ == '__main__':
zip_Data = open('test_zip_file.dat','rb')
zip_data_c = read_in_chunks(zip_Data)
dz = decompress_chunks(zip_data_c)
with open('test4.txt','wb') as tf:
for i in dz:
tf.write(i)
答案 0 :(得分:1)
将压缩块写入文件时,没有任何分隔符。因此,在读取它以进行解压缩时,程序无法解压缩压缩字符串。
通过添加分隔符,我能够解压缩数据并能够检索实际数据。