首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gzip Python 3 vs Gzip Python 2

Gzip Python 3 vs Gzip Python 2
EN

Stack Overflow用户
提问于 2017-02-24 17:56:50
回答 1查看 1.1K关注 0票数 1

问题:有一个旧的代码,它使用Py2 'str‘,也就是使用gzip压缩该字符串,我希望从Py3中的同一个字符串获得相同的输出,但我无法使它工作。

Python2代码

代码语言:javascript
复制
#input_buffer is a str 
string_buffer = StringIO()
gzip_file = GzipFile(fileobj=string_buffer, mode='w', compresslevel = 6)
gzip_file.write(input_buffer)
gzip_file.close()
out_buffer = string_buffer.getvalue()

现在,我尝试在Py3中迁移相同的代码,并期望得到完全相同的结果。

Python3代码

代码语言:javascript
复制
#input_buffer is a the exact same string that I have on Py2
string_buffer = BytesIO()
gzip_file = GzipFile(fileobj=string_buffer, mode=u'w', compresslevel = 6)
gzip_file.write(bytes(input_buffer, 'utf-8'))
gzip_file.close()
out_buffer = string_buffer.getvalue()

我注意到的是,一旦我创建了'str‘a Bytes数组,它就会添加额外的字符,这些字符后来被压缩并在最终结果中看到,即使在我解码代码之后也是如此。此外,没有“忽略”标志的解码将失败,因为一些字符比预期的要大。

我的问题有什么解决办法吗?

总之:我有一个str,我希望Py2和Py3的gzip压缩具有完全相同的输出。在实践中,至少从我尝试过的情况来看,这是行不通的。

谢谢

我看到的一个问题是,即使它们具有相同的值,它们的表示方式也不同,我希望结果看起来像在Python2中一样。

代码语言:javascript
复制
Python3
input_buffer='+\n\x01I\x12Default_Source©$c1f33163-ff63-13e6-bd74-d90d67f22ac4Ñ\x06\x80\x9dº\x9fÌVÐ\x07\x02Ë\x08\n\x01)$'
out_buffer =b'\x1f\x8b\x08\x00\x00x\xb0X\x02\xff\xd3\xe6b\xf4\x14rIMK,\xcd)\x89\x0f\xce/-JN=\xb4R%\xd90\xcd\xd8\xd8\xd0\xccX7-\rH\x18\x1a\xa7\x9a\xe9&\xa5\x98\x9b\xe8\xa6X\x1a\xa4\x98\x99\xa7\x19\x19%&\x9b\x1c\x9e\xc8v\xa8\xe1\xd0\xdcC\xbb\x0e\xcd?\xdc\x13vx\x02;\xd3\xe1n\x0e.FM\x15\x00\x03&\xcf\x15S\x00\x00\x00'

Python2
input_buffer='+\n\x01I\x12Default_Source\xa9$c1f33163-ff63-13e6-bd74-d90d67f22ac4\xd1\x06\x80\x9d\xba\x9f\xccV\xd0\x07\x02\xcb\x08\n\x01)$'
out_buffer ='\x1f\x8b\x08\x00\xae|\xb0X\x02\xff\xd3\xe6b\xf4\x14rIMK,\xcd)\x89\x0f\xce/-JN]\xa9\x92l\x98fllhf\xac\x9b\x96\x06$\x0c\x8dS\xcdt\x93R\xccMtS,\rR\xcc\xcc\xd3\x8c\x8c\x12\x93M.\xb25\xcc\xdd5\xffL\xd8\x05v\xa6\xd3\x1c\\\x8c\x9a*\x00\xe9l\xf0\xeaJ\x00\x00\x00'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-24 18:58:28

在Python2中,input_buffer是字节,字符编码是latin1。在Python3中,您有一个带有unicode的字符串,您将其编码为utf-8。要获得相同的结果,您必须在Python3中编码到latin1:

代码语言:javascript
复制
input_buffer = '+\n\x01I\x12Default_Source©$c1f33163-ff63-13e6-bd74-d90d67f22ac4Ñ\x06\x80\x9dº\x9fÌVÐ\x07\x02Ë\x08\n\x01)$'
string_buffer = BytesIO()
with GzipFile(fileobj=string_buffer, mode='w', compresslevel=6) as gzip_file:
    gzip_file.write(bytes(input_buffer, 'latin1'))
out_buffer = string_buffer.getvalue()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42445277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档