在Python 3中,将字符串转换为字节的最佳方法?
从https://stackoverflow.com/questions/5471158/typeerror-str-does-not-support-the-buffer-interface 的答案中可以看出,似乎有两种不同的方法可以将字符串转换为字节。
哪种方法会更好或更符合Pythonic的要求?还是说这只是一个个人偏好的问题?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
718
3
如果你看一下
bytes
的文档,它指向[bytearray
](https://docs.python.org/3/library/functions.html#func-bytearray)。所以
bytes
可以做的事情远不止是对字符串进行编码。这是Pythonic,它将允许你用任何类型的源参数来调用构造函数,这是有意义的。对于字符串的编码,我认为
some_string.encode(encoding)
比使用构造函数更符合Pythonic的要求,因为它是最能自我记录的 -- "拿这个字符串用这个编码进行编码"比bytes(some_string, encoding)
更清楚 -- 当你使用构造函数的时候没有明确的动词。编辑:我检查了Python的源代码。如果你用CPython向
bytes
传递一个unicode字符串,它会调用PyUnicode_AsEncodedString,这是encode
的实现;所以如果你自己调用encode
,你只是跳过了一个层次的指示。另外,请看Serdalis的评论 --
unicode_string.encode(encoding)
也更符合Pythonic,因为它的逆向是byte_string.decode(encoding)
,对称性很好。这比人们想象的要容易。
绝对好的方法是这两个都不是,而是第三个。从Python 3.0开始,
encode
的第一个参数默认为*'utf-8'
。因此,最好的方法是这也会更快,因为默认参数的结果不是C代码中的字符串
"utf-8"
,而是NULL
,检查起来**快得多!下面是一些时间安排。
尽管有警告,但反复运行后,时间非常稳定--偏差仅为~2%。
使用没有参数的
encode()
与Python 2不兼容,因为在Python 2中,默认字符编码是ASCII。