许多 Python 挑战在 Python 3X 中根本不起作用

A number of PythonChallenges simply do not work in Python 3X

我是尝试#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)))

我一直收到消息类型错误:'str' 不支持缓冲区接口

有什么帮助吗?

我尝试了不同的页面来指示从 Python 2X 到 3X 的可移植性,他们说:'strings are Unicode by default '

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

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

,对吧?

谢谢,如果听起来很蠢,请见谅!

在python3中你可以认为bytes是类似于python2的str的东西,str是python2的unicode。在python3中默认字面量是str,如果要指定字节字面量,在字面量前加一个b。这就是 python 在第一种情况下所要求的:

TypeError: a bytes-like object is required, not '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')

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

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

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

关于您发布的代码存在的问题,必须修改第一个片段以与 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 guide first to understand the concepts and to learn the sane way of dealing with strings, bytes and encoding and then read the Python 2 version of the same 指南以了解其具体特点。