解码字节和SyntaxError:行继续符后的意外字符

时间:2017-07-07 20:47:40

标签: python python-3.x

我已阅读过有关该主题的先前问题但未提及字节。我在pandas数据帧中有如下的字节串(?):\u0393\u03b9\u03ce\u03c1\u03b3\u03bf\u03c2 u039d\u03c4\u03b1\u03bb\u03ac\u03c1\u03b1\u03c2并且我试图将它们转换为人类可读输出。该文本的语言是希腊语,数据是从JSON文件中读取的(json.load / loads对此没什么帮助,而且pd.read_json也没有。)

当我尝试打印这样的对象时,它会打印字节。

带打印的示例代码:

lst = ['\\u0393\\u03b9\\u03ce\\u03c1\\u03b3\\u03bf\\u03c2 \\u039d\\u03c4\\u03b1\\u03bb\\u03ac\\u03c1\\u03b1\\u03c2',
     '\\u0393\\u03b9\\u03ce\\u03c1\\u03b3\\u03bf\\u03c2 \\u039d\\u03c4\\u03b1\\u03bb\\u03ac\\u03c1\\u03b1\\u03c2',
     '\\u0393\\u03b9\\u03ce\\u03c1\\u03b3\\u03bf\\u03c2 \\u039d\\u03c4\\u03b1\\u03bb\\u03ac\\u03c1\\u03b1\\u03c2']

df= pd.DataFrame(lst, columns=["some_bytestrings"])

print(df["some_bytestrings"]) 
# prints: \u0393\u03b9\u03ce\u03c1\u03b3\u03bf\u03c2 \u0...

print(df['some_bytestrings'].values[0]) 
# prints: \u0393\u03b9\u03ce\u03c1\u03b3\u03bf\u03c2 \u039d\u03c4\u03b1\u03bb\u03ac\u03c1\u03b1\u03c2

# eval seems to work for some previous data, don't know why
print(eval(dfsmall['some_bytestrings'].values[0])) 
# ERROR ARISES HERE

print('\\u0393\\u03b9\\u03ce\\u03c1\\u03b3\\u03bf\\u03c2 \\u039d\\u03c4\\u03b1\\u03bb\\u03ac\\u03c1\\u03b1\\u03c2')
# prints \u0393\u03b9\u03ce\u03c1\u03b3\u03bf\u03c2 \u039d\u03c4\u03b1\u03bb\u03ac\u03c1\u03b1\u03c2

print(print(dfsmall['some_bytestrings'].values[0].encode().decode()))
# decoding encoding doesn't work, it prints: \u0393\u03b9\u03ce\u03c1\u03b3\u03bf\u03c2 \u039d\u03c4\u03b1\u03bb\u03ac\u03c1\u03b1\u03c2 

请注意,如果我取出打印输出并再次打印,结果很好:

print("\u0393\u03b9\u03ce\u03c1\u03b3\u03bf\u03c2 \u039d\u03c4\u03b1\u03bb\u03ac\u03c1\u03b1\u03c2")
# prints: 'Γιώργος Νταλάρας'

在我看来,它与Python处理双斜杠(\\)的方式有关,但我似乎无法解决这个问题,因为像string.replace("\\\\", "\\")这样的方法并不是#39} ; t帮助。

1 个答案:

答案 0 :(得分:2)

您已经标记了“byte_strings”(str类型)但是从输出中它们实际上是包含转义序列的文本字符串(unicode_escape类型)。

幸运的是,python包含一个用于解码名为codecs的字符串转义的编解码器。

您可以使用>>> codecs.decode('\\u0393\\u03b9\\u03ce\\u03c1\\u03b3\\u03bf\\u03c2 \\u039d\\u03c4\\u03b1\\u03bb\\u03ac\\u03c1\\u03b1\\u03c2', 'unicode_escape') 'Γιώργος Νταλάρας' 模块解码这些字符串 - 例如:

<?=