Python 2和3中的字符串均以字节为单位

Xop*_*ter 6 python string binary type-conversion

我的函数需要以字符串或二进制数据(例如,从文件读取)的形式接受输入。如果是字符串,我想将其转换为原始数据(bytesbytearray)。

在Python 3中,我可以做到data = bytes(data, 'utf8')。但是,这在Python 2中失败了,因为它只接受一个参数。反之亦然,它data = bytes(data)适用于Python 2,但不适用于Python 3,因为它抱怨需要编码才能工作。

为了便于讨论,我们假设所有输入(如果是字符串形式)都是UTF-8编码的。是否有比下面的怪诞更好的方法来实现我要寻找的东西:

try:
  data = bytes(data, 'utf8')
except:
  data = bytes(data)
Run Code Online (Sandbox Code Playgroud)

nb data.encode()在Py3中工作,但是在字符串包含非ASCII字节的情况下在Py2中失败。

小智 11

这适用于两个版本。即蟒蛇 2 和蟒蛇 3

data = bytes(str(data).encode("utf-8"))
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

您可以使用sys.version_info检查版本:

if sys.version_info < (3, 0):
    data = bytes(data)
else:
    data = bytes(data, 'utf8')
Run Code Online (Sandbox Code Playgroud)

它比依赖异常更具Python性。

  • Python 社区采用了 EAFP(请求宽恕比许可更容易)哲学,因此实际上 try/except 比这更 Pythonic。 (3认同)

Jos*_*son 5

如果您使用 6 个 py2/3 兼容库,您可能更喜欢:

import six
data = bytes(data) if six.PY2 else bytes(data, 'utf8')
Run Code Online (Sandbox Code Playgroud)