Python 3:使用非ASCII字符加载JSON文件

时间:2016-04-08 17:12:34

标签: python json python-3.x

只是尝试将此JSON文件(使用非ascii字符)加载为具有Unicode编码的python字典,但仍然出现此错误:

返回codecs.ascii_decode(input,self.errors)[0]

UnicodeDecodeError:' ascii'编解码器不能解码位置90的字节0xc3:序数不在范围内(128)

JSON文件内容="工具提示":{         " dxPivotGrid-sortRowBySummary":"排序\" {0} \" byThisRow",}

import sys  
import json

data = []
with open('/Users/myvb/Desktop/Automation/pt-PT.json') as f:
    for line in f:
        data.append(json.loads(line.encode('utf-8','replace')))

3 个答案:

答案 0 :(得分:4)

你有几个问题,尽我所知。首先是文件编码。在未指定编码的情况下打开文件时,将使用sys.getfilesystemencoding()打开文件。由于这可能会有所不同(特别是在Windows机器上),因此明智地对大多数json文件使用encoding="utf-8"是一个好主意。由于您的错误消息,我怀疑该文件是使用ascii编码打开的。

接下来,当文件系统对象读取文件时,文件从utf-8解码为python字符串。 utf-8行已经被解码为字符串,并且已经准备好让json读取。当您执行line.encode('utf-8','replace')时,您将该行重新编码为bytes对象,其中json loads(即"加载字符串")无法处理

最后,"tooltip":{ "navbar":"Operações de grupo"}不是有效的json,但它看起来像一个包含单个json对象的漂亮打印的json文件的一行。我的猜测是你应该将整个文件读作1 json对象。

总结你得到:

import json

with open('/Users/myvb/Desktop/Automation/pt-PT.json', encoding="utf-8") as f:
    data = json.load(f)

从名称来看,该文件可能被编码为Windows葡萄牙语代码页。如果是这样,"cp860"编码可能会更好。

答案 1 :(得分:0)

我遇到了同样的问题,对我有用的是创建正则表达式,并解析json文件中的每一行:

REGEXP = '[^A-Za-z0-9\'\:\.\;\-\?\!]+'
new_file_line = re.sub(REGEXP, ' ', old_file_line).strip()

答案 2 :(得分:0)

如果文件的内容与您的内容相似,我可以通过一个简单的镜头阅读该文件:

>>> import json
>>> fname = "data.json"
>>> with open(fname) as f:
...     data = json.load(f)
...
>>> data
{'tooltip': {'navbar': 'Operações de grupo'}}