导出JSON时出现烦人的Unicode错误
我收到了一个错误信息:
Traceback (most recent call last):
File "make.py", line 48, in <module>
json.dump(amazon_review, outfile)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 189, in dump
for chunk in iterable:
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 434, in _iterencode
for chunk in _iterencode_dict(o, _current_indent_level):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 408, in _iterencode_dict
for chunk in chunks:
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 313, in _iterencode_list
yield buf + _encoder(value)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xea in position 173: invalid continuation byte
出现在这段代码上:
with open('amazon_review.json', 'w') as outfile:
json.dump(amazon_review, outfile)
我搞不清楚怎么回事。任何帮助都非常感谢。
3 个回答
0
在你的 amazon_review
结构中,有一个字节字符串。你需要确保只写入 Unicode 字符串到那些你打算用 json.dump
序列化的结构中,因为 JSON 只能表示基于 Unicode 的字符串(在 Python 2 中没有与字节字符串相对应的概念)。
如果字节字符串只包含 ASCII 字符,Python 可以处理这个错误,因为它可以猜测这个字节字符串代表的编码是 ASCII 的超集。但是对于像 0xEA 这样的高位字节,Python 就无法猜测了,所以你需要在把结果传入 amazon_review
之前,先通过调用 .decode('whatever-encoding-it-is-in')
来告诉它这个字节字符串的编码。
如果在你的数据中,0xEA 应该表示带有抑扬符的字母 ê
(Unicode 编码是 U+00EA),那么你可以尝试的编码是 'iso-8859-1'
或 'windows-1252'
。
1
Python 2虽然能返回Unicode字符串,但它并不使用Unicode的接口,这就导致它无法正确读取非ANSI字符。
因此,当你尝试对字符串进行编码时,会出现Unicode解码错误,因为在把它编码回ASCII之前,它无法正确处理Unicode字符串。你可以试试这个方法。
with open('amazon_review.json', 'w') as outfile:
try:
json.dump(amazon_review, outfile)# omit in 3.x!
except UnicodeEncodeError:
pass