【问题标题】:UnicodeDecodeError while dumping dictionary to file using json dump使用 json 转储将字典转储到文件时出现 UnicodeDecodeError
【发布时间】:2016-09-06 03:10:04
【问题描述】:

我有一个字典,是通过读取 Windows 注册表创建的,其中字典的键是注册表键,对应的值是字典中相同键的值。 现在,我正在尝试使用json.dump() 转储到文件中。但是,这在两个不同的系统上给了我两个不同的错误。我不知道字典的内容,但它有 unicode 值。我正在以“ab”模式打开文件以将数据转储到相同的位置。

with open(file_path, 'ab') as fp:
    json.dump(reg_dict, fp)

观察到以下错误:-

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3: invalid start byte

还有

UnicodeDecodeError: 'utf8' codec can't decode byte 0xf1 in position 21: invalid continuation byte

附加两个错误的图像。我不确定如何解决这个问题,也不确定为什么会这样。任何帮助将不胜感激。

【问题讨论】:

  • 请用实际(复制粘贴的)回溯替换您的图像,以便于阅读。
  • reg_dict 是如何创建的?您正在阅读另一个文件吗?
  • 您的reg_dict 中有Unicode——因此您需要使用codecs.open() 打开"utf_8" 编码文件进行写入。
  • @Evert,添加了字典的创建方式。而且,这是我唯一的痕迹。你还在寻找什么?我想放大图像,你可以看到痕迹。谢谢
  • @martineau,你的意思是,首先我必须在将其写入文件之前使用codecs.open()?我的意思是,我仍然很困惑,如何使用这个?

标签: python json python-2.7 dictionary


【解决方案1】:

我想从注册表读取的数据的编码没有改变。所以它是UTF-16。具体来说,一个系统上的 UTF-16LE 和另一个系统上的 UTF-16BE。这解释了不同的错误。如果我的假设是正确的,这可能会对您有所帮助:

import collections
import io
import json

def decode_dict(data):
    if isinstance(data, str):
        return data.decode('utf-16')
    elif isinstance(data, unicode):
        return data
    elif isinstance(data, collections.Mapping):
        return dict(map(decode_dict, data.iteritems()))
    elif isinstance(data, collections.Iterable):
        return type(data)(map(decode_dict, data))
    else:
        return data

with io.open(file_path, 'w', encoding='utf-8') as fh:
    fh.write(json.dumps(decode_dict(reg_dict), ensure_ascii=False))

【讨论】:

  • 即使这行得通,我仍然收到像UnicodeDecodeError: 'utf8' codec can't decode byte 0xf1 in position 62: invalid continuation byte这样的错误
  • @PabitraPati 那么您的输入数据可能不是 UTF-16。打印输入数据的前几个字节,然后四处搜索,看看它们是否揭示了你的数据实际上是什么编码。
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多