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

Python3:使用非ASCII字符加载JSON文件,python,json,python-3.x,Python,Json,Python 3.x,仅尝试将此JSON文件(使用非ascii字符)加载为使用Unicode编码的python字典,但仍会出现以下错误: 返回编解码器。ascii_解码(输入,自身错误)[0] UnicodeDecodeError:“ascii”编解码器无法解码位置90处的字节0xc3:序号不在范围内(128) JSON文件内容=“工具提示”:{ “dxPivotGrid sortRowBySummary”:“排序\”{0}\“按此行”,} 我也有同样的问题,对我有效的是创建一个正则表达式,并解析json文件中的每一

仅尝试将此JSON文件(使用非ascii字符)加载为使用Unicode编码的python字典,但仍会出现以下错误:

返回编解码器。ascii_解码(输入,自身错误)[0]

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

JSON文件内容=“工具提示”:{ “dxPivotGrid sortRowBySummary”:“排序\”{0}\“按此行”,}


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

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

有一个内容与您类似的文件,我可以通过一个简单的快照读取该文件:

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

你不需要读每一行。您有两个选择:

import sys  
import json

data = []
with open('/Users/myvb/Desktop/Automation/pt-PT.json') as f:
    data.append(json.load(f))
或者,您可以加载所有行并将它们传递给json模块:

import sys  
import json

data = []
with open('/Users/myvb/Desktop/Automation/pt-PT.json') as f:
    data.append(json.loads(''.join(f.readlines())))

显然,第一个建议是最好的。

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

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

最后,
“工具提示”:{“导航栏”:“Operações de grupo”}
不是有效的json,但它看起来确实像一行漂亮的json文件,其中包含一个json对象。我猜您应该将整个文件作为一个json对象来读取

把所有这些放在一起,你会得到:

import json

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

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

json.loads
作为参数编码。
pt.json
文件的真正内容是什么?是否有有效的json数据行,或者是一个长json文件?在后一种情况下,最好直接作为文件加载,而不是逐行加载。显示为JSON文件内容的字符串不是有效的JSON,它只是较大对象的一个片段。也尝试过作为文件加载,但同样的问题和错误是先由某个JSON验证器验证JSON文件。有在线工具和一些命令行工具。现在检查修改的问题,这是由于json文件中的某些行,不确定如何修复。经过大量分析,我发现,由于json文件中的数据:“dxPivotGrid sortRowBySummary”:“Sort\”{0}\“byThisRow”,这会去除所有可能不是OP想要的非英语字符。这不是因为葡萄牙语内容,而是因为JSON文件content=“tooltip”:{“dxPivotGrid sortRowBySummary”:“Sort\”{0}\“byThisRow”}我发现您已将导致问题的字符串从非ascii字符更改为非ascii字符。新字符串不包含0xc3 utf-8编码字节,因此我不知道它如何产生“无法解码字节0xc3”错误。无论如何,该字符串不是有效的JSON,但看起来确实像有效JSON的片段。你是说整个文件只包含那一行吗?当一位中国同事的Windows机器上的脚本在Mac上运行正常时,这是一个救命稻草。
import json

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