解析JSON时解码问题[python]

时间:2018-01-15 08:49:04

标签: python json python-3.x utf-8 character-encoding

我在Python中读取一个JSON文件,它有很多字段和值(大约8000条记录)。 环境: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')

1 个答案:

答案 0 :(得分:1)

您要问的片段似乎是双重编码的。基本上,无论最初生成的这些数据是用Latin-1还是一些相关的编码生成的(Windows代码页1252?)。然后它被送到一个将Latin-1转换为UTF-8 ... 两次的过程。

当然,&#34;转换&#34;数据已经是UTF-8,但告诉计算机它的Latin-1只生成mojibake

字符串INGL\xc3\x83\xc2\x89S建议进行此分析,如果您猜测它应该以大写字母说出 Inglés ,并认识到{的{> onResume {3}}是É \xC3然后检查这两个字节在Latin-1中编码的字符(或者,实际上是Unicode,它是Latin-1的超集,尽管它们不是兼容编码级别。)

请注意,能够猜测哪个字符串是所谓的代表来表示这是至关重要的一步;它还解释了为什么要包含有问题数据的代表性片段 - 有足够的背景! - 对于调试至关重要。

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