Python 将字典保存到json文件

Python 将字典保存到json文件,python,json,dictionary,Python,Json,Dictionary,我试图通过以下代码片段将词典保存到json文件中。 我找不到这个网站解决这个问题的答案 怎么了 dic = { b'pejorative': 0, b'greek': 1, b'from': 2, b'english': 3, b'and': 4 ... } json.dump(dic, open(os.path.join(path, 'model_dict.json'), 'wb'), ensure_ascii=False)) 或 怎么了?嗯,它是用错

我试图通过以下代码片段将词典保存到json文件中。 我找不到这个网站解决这个问题的答案

怎么了

dic = { b'pejorative': 0, b'greek': 1, b'from': 2, b'english': 3, b'and': 4 ... } 
json.dump(dic, 
        open(os.path.join(path, 'model_dict.json'), 'wb'), 
        ensure_ascii=False)) 


怎么了?嗯,它是用错误消息中的所有字母写的:

TypeError:键b'pejorative'不是字符串

dict键是bytestring(参见前面的
b'
),
json.dump()
希望它们是(unicode)字符串

解决方法是使用从ByTestRing解码的unicode字符串重建dict,即:

dic = {key.decode():value for key, value in dic.items()} 
但是,如果您的任何密钥包含utf-8以外的任何内容(utf-8是
bytes.decode()
的默认编码),则可能会引发此问题

真正的解决方案当然是修复最初填充
所以你从一开始就使用unicode字符串。

怎么了?嗯,它是用错误消息中的所有字母写的:

TypeError:键b'pejorative'不是字符串

dict键是bytestring(参见前面的
b'
),
json.dump()
希望它们是(unicode)字符串

解决方法是使用从ByTestRing解码的unicode字符串重建dict,即:

dic = {key.decode():value for key, value in dic.items()} 
但是,如果您的任何密钥包含utf-8以外的任何内容(utf-8是
bytes.decode()
的默认编码),则可能会引发此问题

真正的解决方案当然是修复最初填充
所以你从一开始就使用unicode字符串。

官方文件明确声明

json模块总是生成str对象,而不是bytes对象。因此,fp.write()必须支持str imput


实际上,在python中,字符串作为
str
对象存储在内存中,这些对象是
Unicode
编码序列,如果需要,可以使用
.decode()

官方文件明确声明

json模块总是生成str对象,而不是bytes对象。因此,fp.write()必须支持str imput


实际上,在python中,字符串作为
str
对象存储在内存中,这些对象是
Unicode
编码序列,如果需要,可以使用
.decode()
我也遇到了同样的问题。如果需要将“多维”dict转换为UTF:

def convert2utf( data):
    converted_object={}
    for key, value in data.items():
        if (not isinstance(value, dict)) and (not isinstance(value, list)):
            converted_object[key.decode()]=value.decode()
        elif isinstance(value, dict):
            converted_object[key.decode()]=convert2utf(value)
        else:
            sub_list=[]
            for next_item in value:
                sub_list.append(convert2utf(next_item))
            converted_object[key.decode()]=sub_list
    return converted_object

我也有同样的问题。如果需要将“多维”dict转换为UTF:

def convert2utf( data):
    converted_object={}
    for key, value in data.items():
        if (not isinstance(value, dict)) and (not isinstance(value, list)):
            converted_object[key.decode()]=value.decode()
        elif isinstance(value, dict):
            converted_object[key.decode()]=convert2utf(value)
        else:
            sub_list=[]
            for next_item in value:
                sub_list.append(convert2utf(next_item))
            converted_object[key.decode()]=sub_list
    return converted_object

你为什么在钥匙前面放了一个
b
。我认为字典不支持这样的变量。从键中删除
b'
为什么要在键前放一个
b
。我认为字典不支持这样的变量。从键中删除
b'
为什么不能从字节字符串中构建适当的unicode对象?@allo这就是
key.decode()
所做的-但是调用
bytestring.decode()
只有当bytestring仅包含ascii字符或使用解释器的默认编码时,没有指定编码的bytestring才起作用,因此使用“unicode三明治”模式在源代码处解决问题更安全(在输入时解码所有内容,在输出时编码所有内容,仅在内部使用unicode).我只是认为限制转换为ascii并不总是一个解决方案。如果您通过测试环知道它是utf-8,请将其转换为从utf-8解码的unicode,非ascii字符也可以。@allo恐怕我不明白您的意思。。。如果您不知道ByTestRing是如何编码的,那么您当然可以通过将正确的编码传递到
.decode()
,安全地对其进行解码-但这正是unicode三明治模式的要点:在输入端解码所有内容(您很可能知道编码)因此,您不必在代码中的任何其他地方担心它。我想您的编辑是正确的。我只是想知道,为什么您需要将自己限制为ascii作为输入。为什么您不能从字节字符串构建适当的unicode对象?@allo这就是
key.decode()
所做的-但是调用
bytestring.decode()
只有当bytestring仅包含ascii字符或使用解释器的默认编码时,没有指定编码的bytestring才起作用,因此使用“unicode三明治”模式在源代码处解决问题更安全(在输入时解码所有内容,在输出时编码所有内容,仅在内部使用unicode).我只是认为限制转换为ascii并不总是一个解决方案。如果您通过测试环知道它是utf-8,请将其转换为从utf-8解码的unicode,非ascii字符也可以。@allo恐怕我不明白您的意思。。。如果您不知道ByTestRing是如何编码的,那么您当然可以通过将正确的编码传递到
.decode()
,安全地对其进行解码-但这正是unicode三明治模式的要点:在输入端解码所有内容(您很可能知道编码)因此,您不必在代码中的任何其他地方担心它。我想您的编辑是正确的。我只是想知道,为什么您需要将自己限制为ascii作为输入。