TypeError:“str”不支持缓冲区接口建议两种可能的方法将字符串转换为字节:
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
哪种方法更 Pythonic?
网友回答:
这比想象的要容易:
my_str = "hello world"
my_str_as_bytes = str.encode(my_str)
print(type(my_str_as_bytes)) # ensure it is byte representation
my_decoded_str = my_str_as_bytes.decode()
print(type(my_decoded_str)) # ensure it is string representation
您可以通过打印类型进行验证。请参阅下面的输出。
<class 'bytes'>
<class 'str'>
网友回答:
如果您查看 的文档,它会指向:bytes
bytearray
bytearray([source[, encoding[, errors]]])
返回一个新的字节数组。字节数组类型是 0 <= x < 256 范围内的可变整数序列。它具有可变序列类型中所述的大多数可变序列的常用方法,以及字节类型具有的大多数方法,请参阅字节和字节数组方法。
可选的 source 参数可用于以几种不同的方式初始化数组:
如果是字符串,则还必须提供编码(以及可选的错误)参数;bytearray() 然后使用 str.encode() 将字符串转换为字节。
如果它是一个整数,则数组将具有该大小,并将使用空字节进行初始化。
如果是符合缓冲区接口的对象,则将使用该对象的只读缓冲区来初始化字节数组。
如果它是可迭代对象,则它必须是 0 <= x < 256 范围内的整数的可迭代对象,这些整数用作数组的初始内容。
如果没有参数,则会创建一个大小为 0 的数组。
所以可以做的不仅仅是编码一个字符串。它是 Pythonic 的,它允许您使用任何类型的有意义的源参数调用构造函数。bytes
对于编码字符串,我认为这比使用构造函数更 Pythonic,因为它是最自我记录的——“获取这个字符串并用这个编码编码它”比 – 当你使用构造函数时没有明确的动词。some_string.encode(encoding)
bytes(some_string, encoding)
我检查了Python源代码。如果将 unicode 字符串传递给使用 CPython,它会调用 PyUnicode_AsEncodedString,这是 ;因此,如果您称呼自己,则只是跳过了间接级别。bytes
encode
encode
另外,请参阅Serdalis的评论 – 也更Pythonic,因为它的逆是和对称性很好。unicode_string.encode(encoding)
byte_string.decode(encoding)
网友回答:
绝对最好的方法既不是 2 个,而是第 3 个。自 Python 3.0 以来,第一个默认为“永远”参数。因此,最好的方法是encode
'utf-8'
b = mystring.encode()
这也将更快,因为默认参数不是 C 代码中的字符串,而是 NULL,
检查速度要快得多!"utf-8"
以下是一些时间:
In [1]: %timeit -r 10 'abc'.encode('utf-8')
The slowest run took 38.07 times longer than the fastest.
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 183 ns per loop
In [2]: %timeit -r 10 'abc'.encode()
The slowest run took 27.34 times longer than the fastest.
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 137 ns per loop
尽管有警告,但经过反复运行后,时间非常稳定 – 偏差仅为~2%。
使用不带参数与 Python 2 不兼容,因为在 Python 2 中,默认字符编码是 ASCII。encode()
>>> 'äöä'.encode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
模板简介:该模板名称为【TypeError:“str”不支持缓冲区接口,建议两种可能的方法将字符串转换为字节?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。