0

我是尝试#pythonchallenge 的新手,需要一些帮助!我在挑战 8 和一个简单的命令,例如:

import bz2
bz2.decompress('BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084')

在 Python 3X 中不起作用(但在 Python 2x 中起作用)

很多次我不得不从 bytes.decode 更改为 str ,反之亦然,但我只是不知道何时更改以及为什么更改。

另一个例子是挑战 6

 comments = comments + str(bytes.decode((zip_try.getinfo(f_name).comment)))

我不断收到消息 TypeError: 'str' does not support the buffer interface

有什么帮助吗?

我尝试了不同的页面来指示从 Python 2X 到 3X 的可移植性,他们说:'字符串默认为 Unicode'

这是什么意思?我实际上不必通知

 bytes('my stuff', 'utf-8')

, 正确的?

谢谢,如果听起来很愚蠢,对不起!

4

2 回答 2

3

关于您发布的代码的问题,必须修改第一个代码段以使用 Python 3,如下所示:

import bz2
bz2.decompress(b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084')

前缀将b字符串文字标记为字节字符串,而不是 Unicode 字符串的默认值。

在第二种情况下,ZipFile.getinfo().commentbytes类型,所以你需要做

comments += zip_try.getinfo(f_name).comment.decode()

假设commentsstr类型。

至于一般的 Python 2 和 3 文本处理,这是它们之间的主要区别之一。开始时,我建议首先学习官方Python 3 Unicode 指南以了解概念并学习处理字符串、字节和编码的合理方法,然后阅读同一指南的 Python 2 版本以了解其具体内容怪癖。

于 2015-12-15T22:26:51.503 回答
1

在 python 3 中,你可以将 bytes 看作类似于 python2 的 str 的东西,而 str 是 python2 的 unicode。在 python 3 中,默认文字是 str,如果要指定字节文字,请在文字之前添加 ab。这是python在第一种情况下要求的:

TypeError:需要一个类似字节的对象,而不是“str”

所以它会是:

import bz2
bz2.decompress(b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084')

第二种情况,如果没有看到更多代码,我不知道,但请记住,您可以使用 encode 和 decode 方法从字节转换为 str 并返回,类似于带有 str 和 unicode 字符串的 python 2。例如,以下行:

'á'.encode("utf8").decode("utf8")

会将 'á' str 转换为以 utf8 编码的字节,然后再次转换回 str。

于 2015-12-15T22:16:58.887 回答