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


256

例如,我有一个像这样的字符串(返回值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'

是否有人对如何将其用作普通字符串或将其转换为普通字符串有任何想法?



@HanfeiSun您所谓的“ 二进制字符串 ”是一个字节对象(请参阅标准库中有关字节对象的信息
loved.Jesus

Answers:


356

解码它。

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

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

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

27
@lyomi,我用ascii是因为给定的字符串是用ascii字母组成的。如果编码为utf-8(Python 3.x中的默认值,根据doc-string)str.encode,则无需指定编码bytes.decode
-falsetru

2
@lyomi在2016年(及其末日),人们仍然使用ascii。有很多“传统”产品和系统(包括规范),但是还有很多原因导致您可能在不希望unicode或尝试将多个字节“合并”到其中的情况下创建“二进制字符串”一个字符。我们经常用“串”包含例如制造DNS请求等二进制数据
Jmons

我建议添加以下内容以完成答案。大多数时候,我们需要从操作系统中解码字节,例如控制台输出,我发现这样做的最pythonic方法是to import locale和then os_encoding = locale.getpreferredencoding()。这样,我们可以使用my_b_string.decode(os_encoding)
aturegano

2
@aturegano,这不是唯一的选择。sys.getfilesystemencoding()sys.stdin.encodingsys.stdout.encoding。恕我直言,使用那些自动编码检测可以解决问题,因为可以以其他方式编写子程序(OP正在使用子进程)来确定编码(甚至是硬编码)。无论如何,感谢您的反馈。
falsetru

@falsetru请注意,sys.getfilesystemencoding()返回用于在Unicode文件名和字节文件名之间进行转换的编码的名称,并且在很大程度上取决于您使用的操作系统。AFAIK,此函数用于转换为系统的首选表示形式。这意味着它不会推断可以使用上述locale.getpreferredencoding()功能获得的控制台使用的
编码-aturegano

71

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.