一尘不染

解析JSON时出现解码问题[python]

json

我正在用Python阅读JSON文件,其中包含许多字段和值(约8000条记录)。Env:Windows 10,Python 3.6.4;码:

import json
json_data = json.load(open('json_list.json'))
print (json_data)

这样我得到一个错误。下面是堆栈跟踪:

  json_data = json.load(open('json_list.json'))
  File "C:\Program Files (x86)\Python36-32\lib\json\__init__.py", line 296, in load
    return loads(fp.read(),
  File "C:\Program Files (x86)\Python36-32\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 7977319: character maps to <undefined>

伴随着我,我尝试了

import json
with open('json_list.json', encoding='utf-8') as fd:
     json_data = json.load(fd)
     print (json_data)

与此相关,我的程序运行了很长时间,然后挂起,没有任何输出。

我搜索了几乎与此相关的所有主题,但找不到解决方案。

注意:JSON数据是有效的,因为当我在Postman /任何REST客户端上看到它时,它都不会报告任何异常。

关于此方法或替代解决方案的任何帮助(如何将我的JSON数据加载(通过将其转换为字符串然后返回到JSON等)的任何方式)都将有很大的帮助。

这是报告的错误周围的文件外观:

>>> from pprint import pprint
>>> f = open('C:/Users/c5242046/Desktop/test2/dblist_rest.json', 'rb')
>>> f.seek(7977319)
7977319
>>> pprint(f.read(100))
(b'\x81TICA EL ABGEN INGL\xc3\x83\xc2\x89S, S.A.","memory_size_gb":"64","since'
 b'":"2017-04-10","storage_size_gb":"84.747')

阅读 294

收藏
2020-07-27

共1个答案

一尘不染

您要查询的代码段似乎已被双重编码。基本上,无论最初生成此数据的是什么,都会以Latin-1或其他相关编码生成文本(Windows代码页1252?)。然后将其送入将Latin-1转换为UTF-8
两次的过程。

当然,“转换”数据已经是UTF-8了,但告诉计算机它是Latin-1只是产生了mojibake

该字符串INGL\xc3\x83\xc2\x89S 表明,这种分析,如果你可以猜测,它应该说 Inglés
在上的情况下,实现了UTF-8编码É\
XC3
\
X89
,然后检查哪些字符这两个字节编码中的Latin-1(或者,碰巧是Unicode,它是Latin-1的超集,尽管它们在编码级别上不兼容)。

注意,这里至关重要的步骤是能够猜测问题序列 应该
代表哪个字符串。它还说明了为什么要在有足够上下文的情况下包含有问题的数据的代表性片段!-对于调试至关重要。

无论如何,如果整个文件具有相同的症状,则您应该能够撤消第二次,多余且不正确的重新编码。尽管文件中有这么多错误,但让我想像这可能是一个只有几个记录的本地问题。也许它们是从多个输入文件合并而成的,只有其中一个出现此错误。然后,要修复它,需要进行大量的侦探工作,手动编辑或识别并修复错误源。快速而肮脏的解决方法是简单地手动删除任何错误的记录。

2020-07-27