如何在Python中gzip字节数组?

如何在Python中gzip字节数组?,python,bytearray,gzip,python-requests,Python,Bytearray,Gzip,Python Requests,我想先对字节数组中的二进制数据进行gzip,然后通过请求发布。我找到了如何gzip文件,但在字节数组中找不到它。那么,我如何通过Python gzip字节数组呢?如果字节数组不太大,不能多次存储在内存中,称为b,您可以: b_gz = str(b).encode('zlib') 如果您需要首先执行deocding,请查看bytearray的decode()方法。查看Python的zlib-模块 Python 3: 举个简单的例子: import zlib compressed_data = z

我想先对字节数组中的二进制数据进行gzip,然后通过请求发布。我找到了如何gzip文件,但在字节数组中找不到它。那么,我如何通过Python gzip字节数组呢?

如果字节数组不太大,不能多次存储在内存中,称为
b
,您可以:

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

如果您需要首先执行deocding,请查看bytearray的
decode()
方法。

查看Python的
zlib
-模块

Python 3:

举个简单的例子:

import zlib
compressed_data = zlib.compress(my_bytearray)
import zlib
compressed_data = zlib.compress(my_string)
您可以通过以下方式再次解压缩数据:

decompressed_byte_data = zlib.decompress(compressed_data)
decompressed_string = zlib.decompress(compressed_data)

Python 2:

举个简单的例子:

import zlib
compressed_data = zlib.compress(my_bytearray)
import zlib
compressed_data = zlib.compress(my_string)
您可以通过以下方式再次解压缩数据:

decompressed_byte_data = zlib.decompress(compressed_data)
decompressed_string = zlib.decompress(compressed_data)

如您所见,Python 3使用ByteArray,而Python 2使用字符串。

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下的输出,但在Python2.7下工作相同-

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需要访问bytearray内容,请使用buffer()。

丑陋的方法:将其保存在文件中:p。但这可能会有所帮助:我不确定这是否正确?如果你在bytearray上调用
str()
,你会得到类似于
“bytearray(b'test')”
——但是他希望压缩bytearray,而不是一些描述bytearray的字符串(我想这在某些特殊情况下也可能导致数据丢失)。我只是看到代码只在Python 2中工作。在Python3中,这方面有一些变化。好的,这就是我的想法(我主要使用Python3)。你可以在你的帖子中为那些没有阅读“first try”评论的人写一个便条。对我来说,它需要一个字符串,而不是bytearray
compressedData=zlib.compress(mystring)
@mgear这是因为您使用的Python 2需要输入字符串-在Python 3中,函数需要bytearray。。。我已将此添加到我的答案中。From:“请注意,此方法与gzip命令行实用程序不兼容,因为gzip包含头和校验和,而此机制只是压缩内容。”;如果要生成一个完整的与gzip兼容的二进制字符串,并带有头等,可以将gzip.gzip文件与StringIO一起使用