我写了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与解码后的字符串一起使用?
答案 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')