如何在Python中对字节数组进行gzip压缩?

12 投票
4 回答
23434 浏览
提问于 2025-05-01 18:18

我有一些二进制数据,存放在一个字节数组里。我想先把这些数据进行gzip压缩,然后通过请求发送出去。我找到了如何对文件进行gzip压缩的方法,但不知道怎么对字节数组进行压缩。那么,怎么用Python对字节数组进行gzip压缩呢?

暂无标签

4 个回答

1
import zlib 
import binascii


def compress_packet(packet):
    return zlib.compress(buffer(packet),1)

def decompress_packet(compressed_packet):
    return zlib.decompress(compressed_packet)

def demo_zlib() :

    packet1 = bytearray()
    packet1.append(0x41)
    packet1.append(0x42)
    packet1.append(0x43)
    packet1.append(0x44)

    print "before compression: packet:{0}".format(binascii.hexlify(packet1))
    cpacket1 = compress_packet(packet1)
    print "after compression: packet:{0}".format(binascii.hexlify(cpacket1))

    print "before decompression: packet:{0}".format(binascii.hexlify(cpacket1))
    dpacket1 = decompress_packet(buffer(cpacket1))
    print "after decompression: packet:{0}".format(binascii.hexlify(dpacket1))


def main() :
    demo_zlib() 

if __name__ == '__main__' :
    main() 

这样做应该可以。zlib需要访问字节数组的内容,可以使用buffer()来实现这一点。

1

Python标准库中的zlib模块应该能满足你的需求:

>>> import zlib
>>> a = b'abcdefghijklmn' * 10
>>> ca = zlib.compress(a)
>>> len(a)
140
>>> len(ca)
25
>>> b = zlib.decompress(ca)
>>> b == a
True
>>> b
b'abcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmn'

这是在Python3.4下的输出结果,但在Python 2.7下也是一样的效果 -

1

如果这个字节数组(bytearray)不大到无法在内存中存储多次,并且我们把它叫做 b,那么你可以直接这样做:

b_gz = str(b).encode('zlib')

如果你需要先进行解码,可以看看字节数组的 decode() 方法。

18

看看Python的zlib模块吧。

Python 3: zlib模块

这里有个简单的例子:

import zlib
compressed_data = zlib.compress(my_bytearray)

你可以通过以下方式再次解压数据:

decompressed_byte_data = zlib.decompress(compressed_data)

Python 2: zlib模块

这里也有个简单的例子:

import zlib
compressed_data = zlib.compress(my_string)

你可以通过以下方式再次解压数据:

decompressed_string = zlib.decompress(compressed_data)

可以看到,Python 3使用的是字节数组,而Python 2使用的是字符串。

撰写回答