如何在python中解码反斜杠转义字符串?

时间:2018-08-16 21:40:14

标签: python python-3.x utf-8 decode backslash

我有一个csv文件(see here),其中包含来自Facebook公共页面帖子的元数据。我需要解码所有内容,例如:\xc3\xa9\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x92\xbc

元数据“发布消息”为:

  

“ b'Bom dia,genteee!我分发了一个表情符号\ xc3 \ xa9:   \ xf0 \ x9f \ x91 \ xa9 \ xf0 \ x9f \ x8f \ xbb \ xe2 \ x80 \ x8d \ xf0 \ x9f \ x92 \ xbc \ nO que   voc \ xc3 \ xaas acham?'“

,它的类型是str对象。

我需要将其转换为:

  

Bom dia,genteee!我的表情符号和民谣卡拉:‍ O   quevocêsacham?

我该怎么做?我需要转换所有csv。

修改:1:我尝试过

My_string = post_message.split("b'")[1].split("'")[0]
My_string.encode().decode('unicode_escape')

但是结果却与我预期的不同:

  

Bom dia,genteee! Me disseram que esse emojié©minha cara:   ð©ð»âð¼O quevocâsacham?

解决方案

正如@Ben指出的那样,我的数据是一个包含字节的字符串对象,而不是字节对象。因此使用了@ShadowRanger解决方案(see his answer here)。我做到了:

My_string = post_message[2:len(post_message)-1] #to remove "b'" from begining and "'" from end
My_string = My_string.encode('utf-8').decode('unicode_escape').encode('latin-1').decode('utf-8')

结果:

  

Bom dia,genteee!我的表情符号和民谣卡拉:‍ O   quevocêsacham?

1 个答案:

答案 0 :(得分:2)

我注意到您发布的字符串看起来像“ b'...'”,在带引号b的单引号字符串周围用双引号引起来。看起来像一个包含字节字符串的文本表示形式的字符串,而不是将字节字符串打印为文本。

例如:

>>> text = 'föő'
>>> text
'föő'
>>> bytestring = text.encode()
>>> bytestring
b'f\xc3\xb6\xc5\x91'
>>> str(bytestring)
"b'f\\xc3\\xb6\\xc5\\x91'"

这建议您在某个时候有一个字节字符串,并在其上调用str(或类似名称)以将其转换为文本字符串。这样,您就可以得到字节串的文本表示形式,而不是字节串是其编码的文本。

但是,如果该理论是完全正确的,那么您将把反斜杠加倍,如您在上面的示例中所见。因此,如果数据与您在OP中显示的数据完全一样,那么这并不完全适合。

但是,看起来代码在某些时候仍然具有字节,并将它们错误地转换为文本。我会强烈建议您通过查找发生的位置并进行修复来解决此问题,而不是在事后尝试更正此数据。