为了账号安全,请及时绑定邮箱和手机立即绑定

Python 3中将字符串转换为字节的最佳方法?

Python 3中将字符串转换为字节的最佳方法?

qq_花开花谢_0 2019-06-16 15:58:19
Python 3中将字符串转换为字节的最佳方法?似乎有两种不同的方法将字符串转换为字节,如TypeError:“Str”不支持缓冲区接口这些方法中哪一种更好,哪一种更好?还是仅仅是个人喜好的问题?b = bytes(mystring, 'utf-8')b = mystring.encode('utf-8')
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

如果你看那些文档bytes,它指向你bytearray:

字节数组([源[,编码[,错误])

返回一个新的字节数组。字节数组类型是0<=x<256范围内的可变整数序列。它有大多数常见的可变序列方法(在可变序列类型中描述),以及字节类型所具有的大多数方法,参见Bytes和ByteArray方法。

可选源参数可用于以几种不同的方式初始化数组:

如果是字符串,则还必须提供编码参数(以及可选的错误)参数;byteArray()然后使用str.encode()将字符串转换为字节。

如果它是一个整数,数组将具有这个大小,并将被初始化为空字节。

如果它是一个符合缓冲区接口的对象,则对象的只读缓冲区将用于初始化字节数组。

如果它是可迭代的,则必须是0<=x<256范围内的整数可迭代,这些整数用作数组的初始内容。

如果没有参数,则创建大小为0的数组。

所以bytes不仅仅是编码一个字符串。Pythonic允许您使用任何类型的有意义的源参数调用构造函数。

对于编码字符串,我认为some_string.encode(encoding)比使用构造函数更像Pythonic,因为它是最自我记录的-“使用此字符串并使用此编码对其进行编码”比bytes(some_string, encoding)-在使用构造函数时没有明确的动词。

编辑:我检查了Python源代码。如果将Unicode字符串传递给bytes使用CPython,它调用PyUnicode辅助编码字符串的实现。encode所以如果你打电话的话,你只是跳过了一个间接的级别encode你自己。

另外,见Serdalis的评论-unicode_string.encode(encoding)也更像Pythonic,因为它的逆是byte_string.decode(encoding)对称很好。


查看完整回答
反对 回复 2019-06-16
?
富国沪深

TA贡献1790条经验 获得超9个赞

这比人们想象的要容易得多:

my_str = "hello world"my_str_as_bytes = str.encode(my_str)type(my_str_as_bytes) 
# ensure it is byte representationmy_decoded_str = my_str_as_bytes.decode()type(my_decoded_str) # ensure it is string representation


查看完整回答
反对 回复 2019-06-16
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

这个绝对一点儿没错最好的方法不是两个,而是第三个。的第一个参数encode 默认为 'utf-8'从Python3.0开始。所以最好的方法是

b = mystring.encode()

这也会更快,因为默认参数不会在字符串中产生。"utf-8"在C代码中,但是NULL,也就是检查快点!

以下是一些时间安排:

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 loopIn [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%。


使用encode()如果没有参数,Python 2是不兼容的,就像Python 2中的默认字符编码一样ASCII.

>>> 'äöä'.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)


查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 2195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信