带有unicode字符的字典键会引发错误

时间:2015-09-24 11:15:39

标签: python python-2.7 dictionary unicode

我写了CSV解析器。

CSV文件包含带有未识别字符的字符串,而JSON文件包含具有正确字符串的映射。

FILE.CSV

0,�urawska A.
1,Polnar J�zef

dict.json

{
  "\ufffdurawska A.": "\u017burawska A.",
  "Polnar J\ufffdzef": "Polnar J\u00f3zef"
}

parse.py

import csv
import json

proper_names = json.load(open('dict.json'))

with open('file.csv') as csv_file:
    reader = csv.reader(csv_file, delimiter=',')
    for row in reader:
        print proper_names[row[1].decode('utf-8')]
  

Traceback(最近一次调用最后一次):文件“parse.py”,第9行,in          print proper_names [row [1] .decode('utf-8')] UnicodeEncodeError:'ascii'编解码器无法对位置0中的字符u'\ u017b'进行编码:序数   不在范围内(128)

如何将该dict与解码后的字符串一起使用?

2 个答案:

答案 0 :(得分:2)

如果我查看错误消息,我认为问题是价值,而不是关键。 (\ u017b在值中)

所以你还必须对结果进行编码:

print proper_names[row[1].decode('utf-8')].encode('utf-8')

(编辑:修复以解决评论以供将来参考)

答案 1 :(得分:2)

我可以重现错误,并确定错误发生的位置。实际上,带有unicode键的字典没有问题,当您尝试打印无法在ascii中表示的unicode字符时会发生错误。如果您将打印分为两行:

for row in reader:
    val = proper_names[row[1].decode('utf-8')]
    print val

错误将发生在print行。

您必须使用正确的字符集对其进行编码。我最了解的是latin1,但它不能代表\ u017b,所以我再次使用utf8:

for row in reader:
    val = proper_names[row[1].decode('utf-8')]
    print val.encode('utf8')

或直接

for row in reader:
    print proper_names[row[1].decode('utf-8')].encode('utf8')