使用zlib python压缩数据块

时间:2018-02-06 03:11:09

标签: python zlib

我有一个文件,我需要通过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)

1 个答案:

答案 0 :(得分:1)

将压缩块写入文件时,没有任何分隔符。因此,在读取它以进行解压缩时,程序无法解压缩压缩字符串。

通过添加分隔符,我能够解压缩数据并能够检索实际数据。