2016-04-08 85 views
0

只是试图加载此JSON文件(非ASCII字符)与Unicode编码Python字典,但仍然收到此错误:的Python 3:JSON文件加载非ASCII字符

回报codecs.ascii_decode(输入,self.errors)[0]

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

JSON文件内容= “工具提示”:{ “dxPivotGrid-sortRowBySummary”:“Sort \”{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'))) 
+0

'json.loads'作为参数编码。什么是'pt-PT.json'文件的真实内容 - 有没有有效的JSON数据行,或者它是一个长的JSON文件?在以后的情况下,直接将文件作为文件加载,而不是逐行加载。 –

+0

您显示为JSON文件内容的字符串无效JSON,它只是较大对象的片段。 –

+0

尝试加载为文件,但同样的问题和错误显示 – min2bro

回答

0

我有同样的问题,那我的工作是创造一个正则表达式,并解析来自JSON文件中的每一行:

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

这会去除所有非英文字符,这可能不是OP所需的字符。 – tdelaney

0

有与你类似我可以读取该文件内容的文件在一个简单的拍摄:

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

经过大量的分析,我发现,它给这个错误,因为这个数据在json文件中: – min2bro

+0

“dxPivotGrid-sortRowBySummary”:“排序”{0} \“byThisRow”, – min2bro

0

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

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()))) 

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

2

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

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

最后,"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"可能会更好。

+0

这不是因为葡萄牙的内容,而是由于JSON文件内容=“tooltip”:{“dxPivotGrid-sortRowBySummary”:“排序\”{0} \“byThisRow”,} – min2bro

+0

我看到你已经更改了字符串,导致问题中的问题从一个非ascii字符。新字符串不包含0xc3 UTF-8编码字节,所以我不明白它是如何产生“无法解码字节0xc3”的错误。无论如何,该字符串不是有效的JSON,但看起来像一个有效的JSON片段。你是说整个文件只包含那一行吗? – tdelaney