Gzip Python 3 与 Gzip Python 2

Mar*_*ark 1 python gzip python-2.x python-3.x

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

\n\n

Python 2 代码

\n\n
#input_buffer is a str \nstring_buffer = StringIO()\ngzip_file = GzipFile(fileobj=string_buffer, mode='w', compresslevel = 6)\ngzip_file.write(input_buffer)\ngzip_file.close()\nout_buffer = string_buffer.getvalue()\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

Python 3 代码

\n\n
#input_buffer is a the exact same string that I have on Py2\nstring_buffer = BytesIO()\ngzip_file = GzipFile(fileobj=string_buffer, mode=u'w', compresslevel = 6)\ngzip_file.write(bytes(input_buffer, 'utf-8'))\ngzip_file.close()\nout_buffer = string_buffer.getvalue()\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

总结一下:我有一个 str,我希望 Py2 和 Py3 gzip 压缩具有完全相同的输出。实际上,至少从我的尝试来看,它不起作用。

\n\n

谢谢

\n\n

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

\n\n
Python3\ninput_buffer='+\\n\\x01I\\x12Default_Source\xc2\xa9$c1f33163-ff63-13e6-bd74-d90d67f22ac4\xc3\x91\\x06\\x80\\x9d\xc2\xba\\x9f\xc3\x8cV\xc3\x90\\x07\\x02\xc3\x8b\\x08\\n\\x01)$'\nout_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'\n\nPython2\ninput_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)$'\nout_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'\n
Run Code Online (Sandbox Code Playgroud)\n

Dan*_*iel 5

在Python2中input_buffer are bytes, and the character encoding is latin1. In Python3 you have a string, with unicode, which you encode as utf-8. To get the same result, you have to encode in Python 3 to latin1:

\n\n
input_buffer = '+\\n\\x01I\\x12Default_Source\xc2\xa9$c1f33163-ff63-13e6-bd74-d90d67f22ac4\xc3\x91\\x06\\x80\\x9d\xc2\xba\\x9f\xc3\x8cV\xc3\x90\\x07\\x02\xc3\x8b\\x08\\n\\x01)$'\nstring_buffer = BytesIO()\nwith GzipFile(fileobj=string_buffer, mode='w', compresslevel=6) as gzip_file:\n    gzip_file.write(bytes(input_buffer, 'latin1'))\nout_buffer = string_buffer.getvalue()\n
Run Code Online (Sandbox Code Playgroud)\n