【问题标题】:Python 3: JSON File Load with Non-ASCII CharactersPython 3:使用非 ASCII 字符加载 JSON 文件
【发布时间】:2016-07-30 01:34:23
【问题描述】:

只是尝试将此 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')))

【问题讨论】:

  • json.loads 作为参数编码。 pt-PT.json 文件的真实内容是什么 - 是否有有效的 JSON 数据行,或者它是一个长 JSON 文件?在以后的情况下,最好直接作为文件加载,而不是逐行加载。
  • 您显示为 JSON 文件内容的字符串不是有效的 JSON,它只是较大对象的片段。
  • 也尝试加载为文件,但显示相同的问题和错误
  • 首先尝试通过一些 JSON 验证器来验证 JSON 文件。有在线工具,也有一些命令行工具。
  • 现在检查修改的问题,这是由于json文件中的某些行,不知道如何修复它

标签: python json python-3.x


【解决方案1】:

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

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

【讨论】:

  • 这会去除所有可能不是 OP 想要的非英文字符。
【解决方案2】:

拥有与您的内容相似的文件,我可以一口气读取该文件:

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

【讨论】:

  • 经过大量分析发现,由于 json 文件中的数据,它给出了这个错误:
  • "dxPivotGrid-sortRowBySummary": "排序\"{0}\"byThisRow",
【解决方案3】:

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

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

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

【讨论】:

    【解决方案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" 编码可能会更好。

    【讨论】:

    • 不是因为葡萄牙语内容,而是因为 JSON 文件内容 = "tooltip":{ "dxPivotGrid-sortRowBySummary": "Sort\"{0}\"byThisRow",}
    • 我看到您已将导致问题中出现问题的字符串从具有非 ascii 字符的字符串更改。新字符串不包含 0xc3 utf-8 编码字节,所以我看不出它如何产生“无法解码字节 0xc3”错误。无论如何,该字符串不是有效的 JSON,但看起来确实像有效 JSON 的片段。你是说整个文件只包含那一行?
    • 当一个中国同事的 Windows 机器上的脚本在 Mac 上运行良好时,这是一个救命稻草。
    猜你喜欢
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2014-10-23
    相关资源
    最近更新 更多