0

这可能是一件非常简单的事情,我知道在 SO 上有很多像我这样的类似案例,但我就是不知道如何解决这个问题。我对 Python 还是很陌生。

问题

我有一个包含以下内容的 JSON 文件(expr.json):

{
    "vowel": "a|e|i|o|u|y|ä|ö",
    "consonant": "b|c|d|f|g|h|j|k|l|m|n|p|r|s|š|t|v|z|ž"
}

我想读取文件并使用 Python 的 JSON 模块解析它的内容。我想稍后使用re.compile编译键的值。这是我的代码(main.py):

#!/usr/bin/python
# vim: set fileencoding=utf-8 :

import json

myfile = open('expr.json')
data = myfile.read()
myfile.close()

json_data = json.loads(data)
print json_data    # {u'consonant': u'b|c|d|f|g|h|j|k|l|m|n|p|r|s|\u0161|t|v|z|\u017e', u'vowel': u'a|e|i|o|u|y|\xe4|\xf6'}

但是当我尝试访问“元音”时:

json_data['vowel']

我收到以下错误消息:

回溯(最近一次通话最后):

文件“/path to main.py”,第 11 行,在

打印 json_data['元音']

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 12: ordinal > not in range(128) [Finished in 0.1s with exit code 1]

UnicodeDecodeError:“ascii”编解码器无法解码位置 25 中的字节 0xc3:序数不在范围内(128)

我试过什么

1) 尝试在使用data.encode('utf-8') => 调用 json.loads 之前对字符串进行编码 => 仍然是相同的错误消息

2) 使用转义版本导致字符 (ä, ö) 的转义错误:(\u00E4, \u00F6) => 没有错误,但是当我尝试使用 re.compile 编译它们时,它们无法按预期工作(与转义字符)

3) 使用双反斜杠 \\ => 转义字符仍然是相同的错误消息


我在 Mac OSX 上使用 Python 2.7.2 版。我的编辑器是 Sublime Text 2,我已经从编辑器的内置控制台中读取了这些值。我来自 javascript 的世界,我没有同样的问题。

提前谢谢您,如果我的问题重复,我感到非常抱歉!

编辑 1:添加了 Sublime Text 控制台给出的完整错误消息。

4

1 回答 1

1

如果你试试

print repr(json_data['vowel'])

您会看到显示的值,即问题不是 json,而是打印 Unicode。尝试

print u"\xe4"

它应该产生相同的UnicodeEncodeError. 配置您的编辑器以允许从 Python 打印 Unicode。您可以尝试PYTHONIOENCODING=utf-8为编辑器的内置控制台(或它使用的编码)设置环境变量。

与您的问题无关,您可以稍微简化 utf-8 编码的 json 文件的加载:

import json

with open("expr.json", "rb") as file:
    json_data = json.load(file)
于 2013-06-12T19:53:57.517 回答