Python 将字典保存到json文件
我试图通过以下代码片段将词典保存到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)) 或 怎么了?嗯,它是用错
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作为输入。