导出JSON时出现烦人的Unicode错误

1 投票
3 回答
636 浏览
提问于 2025-04-18 08:22

我收到了一个错误信息:

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

我们可能需要了解你传入的 json.dump 的数据更多一些,但我知道这个接口支持一个叫 encoding 的参数,默认值是 utf-8

你有没有试过类似这样的代码:

with open('amazon_review.json', 'w') as outfile:
    json.dump(amazon_review, outfile, encoding="utf-16")

也许可以看看这个 类似的问题

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

撰写回答