我有一个带有十六进制值的 Pandas 数据框,如下所示:
df['col1']
<0020>
<0938>
<002E>
<092B>
<092B>
<0916>
<0915>
<0915>
<096F>
<096C>
我想将十六进制值
转换为相应的 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
,但显示为 两个反斜杠 。此外,在 \u
之前添加一个 r
,最终也会显示两个反斜杠,而不是 unicode 文字。我也尝试了 decode-unicode
,但它也没有用。
此外,如果有人能解释rawstrings、\u等的概念,那就太好了
最佳答案
哎呀,字面值是为了......字面值!一旦有了变量,就应该使用转换函数,例如 int
和 chr
。
这里有一列包含字符串。对于列中的每个单元格,您想要删除第一个和最后一个字符,将剩余的字符处理为十六进制值,并获取具有该代码点的 unicode 字符。在 Python 中,它只是读取:
df['col1'].apply(lambda x: chr(int(x[1:-1], 16)))
根据您的值(value)观,它给出:
0
1 स
2 .
3 फ
4 फ
5 ख
6 क
7 क
8 ९
9 ६
现在为您的错误原因。
\uxxxx
转义序列用于 Python 解析器。当在字符串文字中找到它们时,它们会自动替换为具有该代码点的 unicode 字符。您可以使用 codecs
模块和 unicode_escape
编码来解码包含 actual \u
字符的字符串(这意味着您像在 "\\uxxx"
中一样转义了反斜杠,但是因为您直接拥有代码点的十六进制表示,所以直接使用 chr
会更简单功能。
并且在您的初始代码中,当您编写 '\u'
时,解析器会看到编码字符的初始部分并尝试立即对其进行解码......但找不到六位代码点在它之后,所以它抛出异常。如果你真的想那样做,你必须加倍反斜杠 (\
) 来转义它并将它原样存储在字符串中,然后使用 codecs .decode(..., encoding='unicode_escape')
解码字符串,如 @ndclt's answer 所示.但我不建议你这样做。
可在标准 Python 库文档、chr
函数和 codecs
模块中找到引用。
关于python - 无法将十六进制代码转换为 unicode 字符,出现 unicodeescape 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944504/