如何将Python 3字节字符串变量转换为常规字符串?


116

我已经阅读了一个XML电子邮件附件

bytes_string=part.get_payload(decode=False)

正如我的变量名所示,有效负载以字节字符串形式出现。

我正在尝试使用推荐的Python 3方法将此字符串转换为可以操纵的可用字符串。

该示例显示:

str(b'abc','utf-8')

如何将b(bytes)关键字参数应用于变量bytes_string并使用推荐的方法?

我尝试的方法不起作用:

str(bbytes_string, 'utf-8')

Answers:


210

您在最后一行中几乎正确了。你要

str(bytes_string, 'utf-8')

因为类型bytes_string就是bytes,相同的类型b'abc'


6
str(bytes_string, 'utf-8', 'ignore')通过传递第三个参数可以忽略错误。
Shubhamoy

2
看起来它应该是对pylang答案的注释(该地址用于处理无效输入)。如果(您认为)没有问题bytes_string,那么为什么要忽略错误?
Toby Speight

3
我得到以下你的方法错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte适用以下字节串b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
阿尔珀

@alper,那不是有效的UTF-8字符串,那么您期望什么?
Toby Speight,

感谢您的解决方案
Ajay Kumar

49

调用decode()一个bytes实例来得到它编码的文本。

str = bytes.decode()

5
UnicodeDecodeError:“ utf-8”编解码器无法解码位置230中的字节0xf6:无效的起始字节
Juha Untinen

3
@JuhaUntinen您的编码可能不是utf-8。
tommy.carstensen 16/09/22

4
如何从数组中过滤(跳过)非UTF8字符?
Failov博士16年

9

更新:

没有任何内容,b并且在开头和结尾都使用引号

bytes即使在很奇怪的情况下,也如何转换为字符串。

由于您的代码可能包含无法识别的字符'utf-8',因此最好只使用str而不带任何其他参数:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

如果您添加 'utf-8'参数到这些特定字节,则应该收到错误。

正如PYTHON 3标准所说,text现在不用担心会出现在utf-8中。


结果是“ b'\\ x02-\\ xdfI#)'”,这可能不是他想要的
Glen Thompson

@GlenThompson只是发生不良情况的一个示例。我故意使用此特定文字。如果您的意思是文本b
开头

非常感谢我正在寻找一种方法来删除具有ansi字符的字符串的b''而不进行编码和丢失字符,我是python中的新手,不知道我可以从头开始减少数组并开始使用索引:O
迭戈·费尔南多·穆里略·瓦伦奇'18

@DiegoFernandoMurilloValenci,您的欢迎。很高兴能为您提供帮助。
塞菲(Seyfi)'18

6

如何从数组中过滤(跳过)非UTF8字符?

要在@ uname01的帖子和OP中解决此评论,请忽略以下错误:

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

细节

docs中,以下是使用相同errors参数的更多示例:

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

errors参数指定无法根据编码规则转换输入字符串时的响应。此参数的合法值为'strict'(引发UnicodeDecodeError异常),'replace'(use U+FFFDREPLACEMENT CHARACTER)或'ignore'(仅将字符保留在Unicode结果之外)。

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.