Python/JSON:如何解析UnicodeDecodeError
问题描述:
我一直在尝试最近学习Python,并且跟着这本书,Python for Data Analysis和使用Python 2.7与Canopy。在这本书中,他们提供了一个链接到我保存并分配到path
变量的一些raw data。尝试使用JSON文本文件转换为词典列表后:Python/JSON:如何解析UnicodeDecodeError
records = [json.loads(line) for line in open(path)]
我收到以下错误:
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-17-b1e0b494454a> in <module>()
----> 1 records = [json.loads(line) for line in open(path)]
C:\Users\Marc\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.4.1.1975.win- x86_64\lib\json\__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
336 parse_int is None and parse_float is None and
337 parse_constant is None and object_pairs_hook is None and not kw):
--> 338 return _default_decoder.decode(s)
339 if cls is None:
340 cls = JSONDecoder
C:\Users\Marc\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.4.1.1975.win- x86_64\lib\json\decoder.pyc in decode(self, s, _w)
363
364 """
--> 365 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
366 end = _w(s, end).end()
367 if end != len(s):
C:\Users\Marc\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.4.1.1975.win-x86_64\lib\json\decoder.pyc in raw_decode(self, s, idx)
379 """
380 try:
--> 381 obj, end = self.scan_once(s, idx)
382 except StopIteration:
383 raise ValueError("No JSON object could be decoded")
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 6: invalid start byte
奇怪的是,这个工作在不同的电脑上,我认为正在使用相同版本的Python。提前致谢。
答
有问题的数据包含一个编码为UTF-8的U+2019 RIGHT SINGLE QUOTATION MARK字符。但是您使用了复制粘贴来保存数据,而不是直接将文本保存到磁盘。
在这样做时,某处的数据解码的方式,然后再编码,到Windows代码页1252:
>>> u'\u2019'.encode('cp1252')
'\x92'
换句话说,你的数据文件是不一样。它可能包含相同的数据,但使用不同的编码。
JSON标准状态数据需要为encoded to UTF-8, UTF-16 or UTF-32,UTF-8为默认值,这就是Python json
模块如果不给它编码就会用到的东西。由于您正在为其提供CP-1252数据,因此解码失败。
您的JSON数据不是UTF-8编码的,它显示。你是否100%确定它与你正在解码的数据相同? – 2014-10-11 16:03:45
即使使用相同版本的Python,取决于系统的区域设置,Python将尝试使用的“默认”编码也可能因计算机而异。这种行为是故意的。 – skrrgwasme 2014-10-11 16:07:28
@SLawson:这与默认(文件)编码无关。这是Python 2,不会对文件数据进行解码。 'json'模块会解码,因为JSON标准指定了可接受的(有限的)数量的编码。 – 2014-10-11 16:09:55