【问题标题】:Dictionary keys with unicode characters raise Error带有 unicode 字符的字典键引发错误
【发布时间】:2015-09-24 11:15:39
【问题描述】:

我编写 CSV 解析器。

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

文件.csv

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

dict.json

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

解析.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 行,在 print proper_names[row[1].decode('utf-8')] UnicodeEncodeError: 'ascii' codec can't encode character u'\u017b' in position 0: ordinal 不在范围内(128)

我怎样才能将这个字典与解码的字符串一起使用?

【问题讨论】:

  • 对我来说,您的控制台似乎无法处理 utf-8 。如果您直接尝试将值打印到控制台,您会得到什么,例如print proper_names.values()[0]
  • UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 8: ordinal not in range(128)

标签: python python-2.7 dictionary unicode


【解决方案1】:

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

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

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

(编辑:修复了 cmets 以供将来参考)

【讨论】:

  • 引发 KeyError: '\xef\xbf\xbdurawska A.'
  • print proper_names[row[1].decode('utf-8')].encode('utf-8')
【解决方案2】:

我可以重现错误,并确定它发生的位置。事实上,带有 unicode 键的字典不会导致任何问题,当您尝试打印无法用 ascii 表示的 unicode 字符时会发生错误。如果您将打印分成 2 行:

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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多