如何在Python中gzip字节数组?
我想先对字节数组中的二进制数据进行gzip,然后通过请求发布。我找到了如何gzip文件,但在字节数组中找不到它。那么,我如何通过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
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”评论的人写一个便条。对我来说,它需要一个字符串,而不是bytearraycompressedData=zlib.compress(mystring)
@mgear这是因为您使用的Python 2需要输入字符串-在Python 3中,函数需要bytearray。。。我已将此添加到我的答案中。From:“请注意,此方法与gzip命令行实用程序不兼容,因为gzip包含头和校验和,而此机制只是压缩内容。”;如果要生成一个完整的与gzip兼容的二进制字符串,并带有头等,可以将gzip.gzip文件与StringIO一起使用