TypeError: 'str' does not support the buffer interface建议使用两种可能的方法将字符串转换为字节:
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
哪种方法更像Python?
请参阅Convert bytes to a string了解相反的情况。
TypeError: 'str' does not support the buffer interface建议使用两种可能的方法将字符串转换为字节:
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
哪种方法更像Python?
请参阅Convert bytes to a string了解相反的情况。
5条答案
按热度按时间qvk1mo1f1#
如果您查看
bytes
的文档,它会将您指向bytearray
:字节数组([源[,编码[,错误]]])
返回一个新的字节数组。bytearray类型是一个可变的整数序列,范围为0〈= x〈256。它拥有可变序列类型中描述的可变序列的大多数常用方法,以及bytes类型拥有的大多数方法,请参见字节和字节数组方法。
可选的source参数可用于以几种不同的方式初始化数组:
如果是字符串,还必须给予编码(和可选的错误)参数;bytearray()然后使用str.encode()将字符串转换为字节。
如果是整数,数组将具有该大小,并将使用空字节初始化。
如果是符合缓冲区接口的对象,则使用该对象的只读缓冲区初始化字节数组。
如果它是一个可迭代对象,它必须是0〈= x〈256范围内的整数的可迭代对象,这些整数用作数组的初始内容。
如果没有参数,则创建大小为0的数组。
所以
bytes
可以做的不仅仅是编码字符串,Python允许你用任何类型的源参数来调用构造函数。对于编码字符串,我认为
some_string.encode(encoding)
比使用构造函数更像Python,因为它是最自文档化的--“获取这个字符串并用这个编码对它进行编码”比bytes(some_string, encoding)
更清楚--使用构造函数时没有显式动词。我查了Python源码,如果你用CPython把一个unicode字符串传递给
bytes
,它调用PyUnicode_AsEncodedString,这是encode
的实现;所以如果你自己调用encode
,你就跳过了间接层。另外,请参见Serdalis的评论--
unicode_string.encode(encoding)
也更像Python,因为它的逆是byte_string.decode(encoding)
,而且对称性很好。xytpbqjk2#
这比想象的要容易:
您可以通过打印类型进行验证。请参考下面的输出。
oug3syen3#
encode
* 的第一个参数从Python 3.0开始默认为 *'utf-8'
。因此,最好的方法是这样做也会更快,因为默认参数的结果不是C代码中的字符串
"utf-8"
,而是 *NULL
*,这样检查起来要快得多!以下是一些时间安排:
尽管有警告,但重复运行后时间非常稳定-偏差仅为~ 2%。
使用不带参数的
encode()
与Python 2不兼容,因为在Python 2中默认的字符编码是 ASCII。9gm1akwq4#
回答一个稍微不同的问题:
您有一个保存到str变量中的原始unicode序列:
您需要能够获得该unicode的字节文字(对于struct.unpack()等)
解决方案:
参考(向上滚动查看标准编码):
Python特定编码
h9a6wy2h5#
Python 3的“内存视图”方式如何?
Memoryview是字节/字节数组和struct模块的混合体,有几个优点。
最简单的例子,对于字节数组:
或表示unicode字符串(转换为字节数组)
也许您需要的是字而不是字节?
**注意事项。**对于多个字节的数据,请注意字节顺序的多种解释:
不知道这是故意的还是一个错误,但它抓住了我!
该示例使用了UTF-16,有关编解码器的完整列表,请参见Python 3.10中的编解码器注册表