我已阅读过有关该主题的先前问题但未提及字节。我在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帮助。
答案 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')
'Γιώργος Νταλάρας'
模块解码这些字符串 - 例如:
<?=