这是使代码与 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 类型支持 encodedecode 方法以允许在 str 类型的两侧之间切换。

在Python3中,角色定义更严格,可以调用str.encode得到一个bytes值,也可以调用bytes.decode得到一个str 值。您无法解码 str 或进一步编码 bytesstr.decodebytes.encode 根本不存在。


从某种意义上说,所有文件都是二进制文件:它们由字节流组成。我们所说的文本文件只是一个文件,其字节旨在使用特定的文本解码器(如 ASCII 或 UTF-8)进行解码,而不是像 JPEG 解码器、JVM 或你的 CPU本身。

当您使用 open 以文本模式(默认)打开文件时,它的 read 方法 returns str 值,由应用文件对象的解码器产生到从文件中读取的原始字节。

当您使用 open 以二进制模式打开文件时,它的 read 方法 returns bytes 值,原始字节未解码供您处理如您所愿。