【问题标题】:annoying unicode error while dumping json转储json时烦人的unicode错误
【发布时间】:2014-06-03 05:09:44
【问题描述】:

所以我收到错误消息:

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)

我能猜出来。任何帮助都会很棒。

【问题讨论】:

  • 我想我们需要了解一点amazon_review 的内容才能在这里提供太多帮助...
  • 看看at this question;我不会将其标记为重复尚未,但我觉得这是你的问题。

标签: python unicode


【解决方案1】:

Python 2 不使用 Unicode 接口,即使它返回 Unicode 字符串,所以它永远不会正确读取非 ANSI 字符。

因此尝试对其进行 .encode 编码失败,并出现 Unicode​Decode​Error 尝试在将 Unicode 字符串编码回 ASCII 之前获取它。尝试使用它。

with open('amazon_review.json', 'w') as outfile:
    try:
        json.dump(amazon_review, outfile)# omit in 3.x!
    except UnicodeEncodeError:
        pass

【讨论】:

  • 如果您不想打开其中包含非 ANSI 字符的文件。但是,如果您需要它,则必须解析文件并省略该字符。
  • 但是需要更多关于您的 amazon_review 的详细信息
【解决方案2】:

我们可能需要更多地了解您传递给 json.dump 的数据,但我知道 api 支持默认为 utf-8encoding kwarg。

你有没有尝试过类似的东西

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

可能值得看看这个similar issue

【讨论】:

    【解决方案3】:

    amazon_review 的结构中某处有一个字节字符串。您应该确保只将 Unicode 字符串写入您打算使用 json.dump 序列化的结构,因为 JSON 只能表示基于 Unicode 的字符串(没有字节字符串的概念来匹配 Python 2 的 str)。

    只要字节字符串仅包含 ASCII 字符,Python 就可以处理该错误,因为可以很好地猜测该字节字符串表示的任何编码都是 ASCII 超集。但是对于像 0xEA 这样的最高位设置字节,它无法猜测,因此您必须在将结果传递给 amazon_review 之前通过在字节字符串上调用 .decode('whatever-encoding-it-is-in') 来告诉它。

    如果在您的数据中 0xEA 应该代表 U+00EA e-with-circumflex ê,那么要尝试的编码将是 'iso-8859-1''windows-1252'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2013-03-01
      • 2014-05-20
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多