【问题标题】:Can't correctly encode JSON file in Python无法在 Python 中正确编码 JSON 文件
【发布时间】:2013-06-12 19:30:28
【问题描述】:

这可能是一件非常简单的事情,我知道在 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']

我收到以下错误消息:

Traceback(最近一次调用最后一次):

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

打印 json_data['元音']

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 12: ordinal > not in range(128) [0.1s 完成,退出码 1]

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)

我尝试了什么

1) 在调用 json.loads 之前尝试使用 data.encode('utf-8') 对字符串进行编码 => 还是一样的错误信息

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

3) 使用双反斜杠转义字符 \\ => 还是一样的错误信息


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

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

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

【问题讨论】:

  • 这不是给你这个错误的完整代码。
  • Sublime Text 是否有某种内置的 Python 解释器来运行代码?
  • 感谢所有帮助我解决这个问题的人! :) 结果证明解决方案与我最初想象的完全不同。

标签: python json unicode ascii


【解决方案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)

【讨论】:

  • 呃,你是对的!运行 print u"\xe4" 会引发 UnicodeEncodeError。所以问题不在于我的代码,而在于编辑器?它一直让我发疯!谢谢!
  • 我尝试在终端中运行print u"\xe4",它给了我预期的结果!感谢您为我解决这个问题!我自己要花很长时间才能解决它,拼命试图修改我的代码=P
猜你喜欢
  • 2014-07-28
  • 2014-10-04
  • 1970-01-01
  • 2021-03-28
  • 2015-06-27
  • 2022-10-20
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
相关资源
最近更新 更多