这可能是非常简单的事情,我知道有很多像我这样的类似案例,但我无法弄清楚如何解决这个问题。我还是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']
我收到以下错误消息:
追踪(最近一次呼叫最后一次):
文件“/ main.py路径”,第11行,
print json_data ['vowel']
UnicodeEncodeError:'ascii'编解码器无法对位置12中的字符u'\ xe4'进行编码:序数>不在范围内(128) [以0.1秒完成退出代码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的世界,我没有同样的问题。
提前谢谢你,如果我的问题重复,我非常抱歉!
答案 0 :(得分: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)