似乎有两种不同的方法可以将字符串转换为字节,如答案所示:’str’ does not support the buffer interface
这些方法中的哪一个会更好或更 Pythonic?还是只是个人喜好问题?
b = bytes(mystring, 'utf-8') b = mystring.encode('utf-8')
如果您查看文档bytes,它会指向您bytearray:
bytes
bytearray
字节数组([源[,编码[,错误]]]) 返回一个新的字节数组。bytearray 类型是 0 <= x < 256 范围内的可变整数序列。它具有可变序列的大多数常用方法,在可变序列类型中描述,以及字节类型具有的大多数方法,请参见字节和字节数组方法。 可选的源参数可用于以几种不同的方式初始化数组: 如果是字符串,还必须提供编码(以及可选的错误)参数; bytearray() 然后使用 str.encode() 将字符串转换为字节。 如果它是一个整数,则该数组将具有该大小,并将使用空字节进行初始化。 如果是符合缓冲区接口的对象,将使用该对象的只读缓冲区来初始化字节数组。 如果是可迭代的,则必须是 0 <= x < 256 范围内的整数的可迭代,用作数组的初始内容。 如果没有参数,则会创建一个大小为 0 的数组。
字节数组([源[,编码[,错误]]])
返回一个新的字节数组。bytearray 类型是 0 <= x < 256 范围内的可变整数序列。它具有可变序列的大多数常用方法,在可变序列类型中描述,以及字节类型具有的大多数方法,请参见字节和字节数组方法。
可选的源参数可用于以几种不同的方式初始化数组:
如果是字符串,还必须提供编码(以及可选的错误)参数; bytearray() 然后使用 str.encode() 将字符串转换为字节。
如果它是一个整数,则该数组将具有该大小,并将使用空字节进行初始化。
如果是符合缓冲区接口的对象,将使用该对象的只读缓冲区来初始化字节数组。
如果是可迭代的,则必须是 0 <= x < 256 范围内的整数的可迭代,用作数组的初始内容。
如果没有参数,则会创建一个大小为 0 的数组。
所以bytes可以做的不仅仅是编码一个字符串。它是 Pythonic,它允许您使用任何有意义的源参数类型调用构造函数。
对于字符串的编码,我认为这some_string.encode(encoding)比使用构造函数更 Pythonic,因为它是最自我记录的——“获取这个字符串并用这个编码对其进行编码”比bytes(some_string, encoding)——当你使用构造函数。
some_string.encode(encoding)
bytes(some_string, encoding)
我检查了 Python 源代码。如果您将 unicode 字符串传递给bytes使用 CPython,它会调用PyUnicode_AsEncodedString,这是 ; 的实现encode。所以如果你打电话给encode自己,你只是跳过了一个间接级别。
encode
另外,请参阅 Serdalis 的评论 -unicode_string.encode(encoding)也更 Pythonic,因为它的逆是byte_string.decode(encoding)并且对称性很好。
unicode_string.encode(encoding)
byte_string.decode(encoding)