使用json转储将字典转储到文件时的UnicodeDecodeError

时间:2016-09-06 03:10:04

标签: python json python-2.7 dictionary

我有一个字典,通过阅读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

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

Error in System 1

Error in System 2

1 个答案:

答案 0 :(得分: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))