如何在Python3中将“二进制字符串”转换为普通字符串?

427

例如,我有一个这样的字符串(subprocess.check_output的返回值):

>>> b'a string'
b'a string'

无论我对它做了什么,它总是在字符串前面烦人地打印出b'

>>> print(b'a string')
b'a string'
>>> print(str(b'a string'))
b'a string'

有人有关于如何将它用作普通字符串或将其转换为普通字符串的想法吗?


1
可能是将字节转换为字符串?的重复问题。 - Georgy
1
@HanfeiSun,你所说的“二进制字符串”实际上是一个字节对象(请参阅标准库中关于字节对象的信息)。 - loved.by.Jesus
3个回答

608

解码它。

>>> b'a string'.decode('ascii')
'a string'

要从字符串中获取字节,请对其进行编码。

>>> 'a string'.encode('ascii')
b'a string'

37
@lyomi,我使用ASCII是因为给定的字符串是由ASCII字符组成的。如果编码是utf-8(根据str.encodebytes.decode文档字符串,在Python 3.x中默认),则无需指定编码。 - falsetru
2
@lyomi 在2016年(即将结束),人们仍然使用ASCII。有许多“遗留”的产品和系统(包括规范),但也有很多原因,为什么你可能会创建一个“二进制字符串”,其中你不想要Unicode或者尝试将多个字节合并成一个字符的东西。我们经常使用“字符串”来包含二进制数据,例如进行DNS请求等。 - Jmons
我建议添加以下内容以完成答案。大多数时候,我们需要从操作系统解码字节,例如控制台输出,我发现最Pythonic的方法是import locale,然后os_encoding = locale.getpreferredencoding()。这样,我们可以使用my_b_string.decode(os_encoding)进行解码。 - aturegano
2
@aturegano,这不是唯一的选择。sys.getfilesystemenconding()sys.stdin.encodingsys.stdout.encoding。我认为使用这些自动编码检测可以解决问题,因为子程序(OP正在使用子进程)可能会以其他方式编写来确定编码(甚至硬编码)。不管怎样,感谢您的反馈。 - falsetru
@lyomi ASCII永存 - micah
显示剩余2条评论

127

如果来自falsetru的答案不起作用,您也可以尝试:

>>> b'a string'.decode('utf-8')
'a string'

11
查看codecs库中的官方encode()decode()文档。对于这些函数,默认的编码方式是utf-8,但在Python 3中还有几种标准编码方式,如latin_1utf_32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接