Python 2.7 解码 UTF-8 和 unicode-escape 在 Python 中导致 UnicodeEncodeError

2024-10-01 22:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个tsv文件,在某些行中,一个特定的列包含混合格式,例如:Hapoel_Be\u0027er_Sheva_A\u002eF\u002eC\u002e,它应该是Hapoel_Be'er_Sheva_A.F.C.。在

下面是我用来读取文件和拆分列的代码:

with open(path, 'rb') as f:
  for line in f:
      cols = line.decode('utf-8').split('\t')
      text = cols[3].decode('unicode-escape') #Here is the column that has the above mentioned mixed format

错误消息:

^{pr2}$

我想知道如何从第一个混合格式转换成另一个,同时阅读文件?我使用的是python2.7。在

非常感谢你


Tags: 文件thetsv格式linebecolsdecode
2条回答

您可以使用decode('unicode-escape')将这些十六进制序列转换为字符。在

>>> 'Hapoel_Be\\u0027er_Sheva_A\\u002eF\\u002eC\\u002e'.decode('unicode-escape')
u"Hapoel_Be'er_Sheva_A.F.C."

编辑:根据您对问题的更新,您实际上有一个hex序列和Unicode字符的组合,超出了ASCII范围。错误来自于Python2.7尝试在Unicode字符串上使用.decode()时进行的自动转换-decode只对字节字符串有效,因此它尝试使用ASCII编解码器从Unicode转换。python3不允许这个错误。在

要解决这个问题,您需要一个双重转换,一个将这些非ASCII字符转换为十六进制序列,另一个将它们转换回。'unicode-escape'编解码器将使反斜杠加倍,因此也必须更正这些反斜杠。在

^{pr2}$

可以使用ast.literal_eval将原始字节转换为unicode

import ast

raw_bytes = br'Hapoel_Be\u0027er_Sheva_A\u002eF\u002eC\u002e'
print(raw_bytes)  # b'Hapoel_Be\u0027er_Sheva_A\u002eF\u002eC\u002e'

unicode_string = ast.literal_eval('"{}"'.format(raw_bytes.decode('utf8')))

unicode_string的输出:

^{pr2}$

更新-在Python2.7中进行了测试,效果很不错

相关问题 更多 >

    热门问题