我有一个字典,通过阅读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
为两个错误附加图像。我不知道如何解决这个问题,也不知道为什么会这样。任何帮助将不胜感激。
答案 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))