这是使代码与 Python3 一起工作的正确方法吗?
Is this the right way to make code working with Python3?
我正在更新一些Python2别人写的代码,这部分:
def exec(self, content, query):
# query = "city_68"
content = content.strip().strip(',').decode('utf-8', 'ignore')
query = query.decode('utf-8', 'ignore')
query_list = query.split('|')
这在 Python3 中给出了一个错误:
File "/Users/cong/bexec.py", line 708, in bexec
content = content.strip().strip(',').decode('utf-8', 'ignore')
AttributeError: 'str' object has no attribute 'decode'
参数content和query均为字符串。所以我删除了解码部分:
content = content.strip().strip(',')
# query = query.decode('utf-8', 'ignore')
现在它不再抱怨了。这样做安全吗?我想在 Python3 它不再需要 decode() 了。
正确。在 Python 3 中,如果你有一个 str
值,你可以假设它是一个正确的 Unicode 代码点序列,而不是需要从(比如)UTF-8 解码为一个 Unicode 字符串。如果您有一个 bytes
值,您必须先对其进行解码才能获得正确的 Unicode 字符串。
在Python 2中,边界更宽松。 unicode
值绝对是一个正确的 Unicode 字符串(并在 Python 3 中重命名为 str
),而 str
值可能是一个“真正的”纯 ASCII 字符串值或任意二进制数据:您无法仅从类型中分辨出来。
因此,str
类型支持 encode
和 decode
方法以允许在 str
类型的两侧之间切换。
在Python3中,角色定义更严格,可以调用str.encode
得到一个bytes
值,也可以调用bytes.decode
得到一个str
值。您无法解码 str
或进一步编码 bytes
。 str.decode
和 bytes.encode
根本不存在。
从某种意义上说,所有文件都是二进制文件:它们由字节流组成。我们所说的文本文件只是一个文件,其字节旨在使用特定的文本解码器(如 ASCII 或 UTF-8)进行解码,而不是像 JPEG 解码器、JVM 或你的 CPU本身。
当您使用 open
以文本模式(默认)打开文件时,它的 read
方法 returns str
值,由应用文件对象的解码器产生到从文件中读取的原始字节。
当您使用 open
以二进制模式打开文件时,它的 read
方法 returns bytes
值,原始字节未解码供您处理如您所愿。
我正在更新一些Python2别人写的代码,这部分:
def exec(self, content, query):
# query = "city_68"
content = content.strip().strip(',').decode('utf-8', 'ignore')
query = query.decode('utf-8', 'ignore')
query_list = query.split('|')
这在 Python3 中给出了一个错误:
File "/Users/cong/bexec.py", line 708, in bexec
content = content.strip().strip(',').decode('utf-8', 'ignore')
AttributeError: 'str' object has no attribute 'decode'
参数content和query均为字符串。所以我删除了解码部分:
content = content.strip().strip(',')
# query = query.decode('utf-8', 'ignore')
现在它不再抱怨了。这样做安全吗?我想在 Python3 它不再需要 decode() 了。
正确。在 Python 3 中,如果你有一个 str
值,你可以假设它是一个正确的 Unicode 代码点序列,而不是需要从(比如)UTF-8 解码为一个 Unicode 字符串。如果您有一个 bytes
值,您必须先对其进行解码才能获得正确的 Unicode 字符串。
在Python 2中,边界更宽松。 unicode
值绝对是一个正确的 Unicode 字符串(并在 Python 3 中重命名为 str
),而 str
值可能是一个“真正的”纯 ASCII 字符串值或任意二进制数据:您无法仅从类型中分辨出来。
因此,str
类型支持 encode
和 decode
方法以允许在 str
类型的两侧之间切换。
在Python3中,角色定义更严格,可以调用str.encode
得到一个bytes
值,也可以调用bytes.decode
得到一个str
值。您无法解码 str
或进一步编码 bytes
。 str.decode
和 bytes.encode
根本不存在。
从某种意义上说,所有文件都是二进制文件:它们由字节流组成。我们所说的文本文件只是一个文件,其字节旨在使用特定的文本解码器(如 ASCII 或 UTF-8)进行解码,而不是像 JPEG 解码器、JVM 或你的 CPU本身。
当您使用 open
以文本模式(默认)打开文件时,它的 read
方法 returns str
值,由应用文件对象的解码器产生到从文件中读取的原始字节。
当您使用 open
以二进制模式打开文件时,它的 read
方法 returns bytes
值,原始字节未解码供您处理如您所愿。