首页 > Python > TypeError:“str”不支持缓冲区接口,建议两种可能的方法将字符串转换为字节?

TypeError:“str”不支持缓冲区接口,建议两种可能的方法将字符串转换为字节?

上一篇 下一篇

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'>

分割线

网友回答:

如果您查看 的文档,它会指向:bytesbytearray

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,这是 ;因此,如果您称呼自己,则只是跳过了间接级别。bytesencodeencode

另外,请参阅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】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 279次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-07
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信模板 html5 自适应 微信公众平台 单页式简历模板 企业网站 微信文章 微信图片 微信素材 响应式
您可能会喜欢的其他模板