无法在Python中正确编码JSON文件

时间:2013-06-12 19:30:29

标签: python json unicode ascii

这可能是非常简单的事情,我知道有很多像我这样的类似案例,但我无法弄清楚如何解决这个问题。我还是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的世界,我没有同样的问题。

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

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

1 个答案:

答案 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)