许多 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().comment
是bytes
类型的,所以你需要做
comments += zip_try.getinfo(f_name).comment.decode()
假设 comments
是 str
类型。
至于一般的 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 指南以了解其具体特点。
我是尝试#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().comment
是bytes
类型的,所以你需要做
comments += zip_try.getinfo(f_name).comment.decode()
假设 comments
是 str
类型。
至于一般的 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 指南以了解其具体特点。