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

min*_*bro 0 python json python-3.x

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

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

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

JSON文件内容=“ tooltip”:{“ 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')))
Run Code Online (Sandbox Code Playgroud)

tde*_*ney 5

据我所知,您有几个问题。首先是文件编码。当您在不指定编码的情况下打开文件时,文件将以任何sys.getfilesystemencoding()形式打开。由于这可能会有所不同(尤其是在Windows计算机上),因此最好将其显式encoding="utf-8"用于大多数json文件。由于您的错误消息,我怀疑该文件是用ascii编码。

接下来,文件被文件系统对象读取时,将从utf-8解码为python字符串。utf-8行已被解码为字符串,并且已经准备好供json读取。当您这样做时line.encode('utf-8','replace'),会将行编码回bytesjson 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)
Run Code Online (Sandbox Code Playgroud)

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