无法将十六进制代码转换为unicode字符,出现unicodeescape错误

时间:2019-09-15 13:21:13

标签: python pandas dataframe unicode

我有一个熊猫数据框,具有十六进制值,如下所示:

df['col1']

<0020>
<0938>
<002E>
<092B>
<092B>
<0916>
<0915>
<0915>
<096F>
<096C>

我想将hex values转换为其相应的unicode文字。因此,我尝试执行以下操作:

df['col1'] = df['col1'].apply(lambda x : '\u' + str(x)[1:-1])

希望,将其转换为我的必需的unicode文字,但出现以下错误:

File "<ipython-input-22-891ccdd39e79>", line 1
    df['col1'].apply(lambda x : '\u' +  str(x)[1:-1])
                                      ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX escape

在python3中,当我们尝试以下操作时,我们得到:

>>> string1 = '\u03b4'
>>> print(string1)
>>> δ

因此,我尝试在给定的字符串中添加 \ u ,也尝试添加\\u,但这显示为 两个反斜杠 < / strong>。另外,在r之前添加\u,也会显示两个反斜杠,而不是unicode文字。我也尝试过decode-unicode,但是也没有用。

如果有人可以解释原始字符串 \ u 等的概念,那也很好。

2 个答案:

答案 0 :(得分:2)

糟糕,文字是用于...文字值!一旦有了变量,就应该使用.wavint之类的转换函数。

这里有一列包含字符串。对于该列中的每个单元格,您要删除第一个和最后一个字符,处理保留为十六进制值的内容,并获得具有该代码点的unicode字符。在Python中,它的内容为:

chr

根据您的值,它会给出:

df['col1'].apply(lambda x: chr(int(x[1:-1], 16)))

现在由于您的错误原因。

0 1 स 2 . 3 फ 4 फ 5 ख 6 क 7 क 8 ९ 9 ६ 转义序列适用于Python 解析器。当在字符串文字中找到它们时,它们将自动替换为具有该代码点的unicode字符。您可以使用\uxxxx模块和codecs编码对包含 actual unicode_escape个字符的字符串进行解码(这意味着您可以像{ {1}},但是由于您直接拥有代码点的十六进制表示,因此直接使用\u函数更简单。

在您的初始代码中,当您编写"\\uxxx"时,解析器会看到已编码字符的初始部分,并尝试立即对其进行解码...但是在其后找不到六进制代码点,因此它将抛出例外。如果您确实想这样做,则必须将反斜杠(chr)加倍以转义并将其原样存储在字符串中,然后使用'\u'进行解码如@ndclt's answer中所示的字符串。但我不建议您这样做。

可在标准Python库文档,\函数和codecs.decode(..., encoding='unicode_escape')模块中找到参考。

答案 1 :(得分:1)

为了将您所有的代码转换为unicode,请在此处一行:

import codecs
import pandas as pd
(
    # create a series with the prefix  "\u" to add to the existing column
    pd.Series([r'\u'] * len(df['col1']))
    # str.strip deletes the "<" and ">" from your column
    # str.cat concatenates the prefix created before to the existing column
    .str.cat(df['col1'].str.strip('<>'))
    # then you apply a conversion from the raw string to normal string.
    .apply(codecs.decode, args=['unicode_escape'])
)

在前面的代码中,您必须将前缀创建为原始字符串。如果不是,则Python正在等待有效的utf-8代码(您的代码中存在错误)。

编辑:我在Serge Ballesta post

中添加了说明
  

\ uxxxx转义序列用于Python解析器。当在字符串文字中找到它们时,它们将自动替换为具有该代码点的unicode字符。您可以使用编解码器模块和unicode_escape编码来解码包含实际\ u字符字符的字符串(这意味着您可以像在\ uxxx中那样对反斜杠进行转义,但是由于您直接拥有代码点的十六进制表示,因此可以直接使用chr函数更简单。

他的解决方案比我的解决方案更优雅。