如何最好地使用Python搁架库(bsddb)将腌制的Python字典转换为具有字典键元组值的JSON文件

时间:2018-12-19 00:08:05

标签: python json shelve bsddb

我有一个应用程序,需要将Python搁置的腌制字典文件转换为JSON文件。

import ujson, shelve

with open("shelveFile", "r") as sfile:
    shelve_dict=shelve.open(sfile)
    py_dict= dict(shelve_dict)
    with open("jsonfile.json","w") as jsonfile:
        ujson.dump(py_dict, jsonfile)
    with open("jsonfile.json",'r') as readJSONfile:
        ujson.loads(readJSONfile.read())

注意:如果我使用ujson.load(jsonfile2),则会出现序列化错误。

我遇到的问题:搁置文件对某些字典键使用Python元组数据类型。我可以使用ujson.dump另存为JSON,但是当我尝试使用ujson.load(jsonfile)时,键将加载为字符串而不是元组。 缺少使用字典解析来转换键的方式(不确定确切的语法),有没有一个库可以将搁置文件转换为JSON文件,我可以将其重新加载到Python字典对象中?

通过ujson.loads(fileobj.read())方法加载时:

{"('tuplekey1','tuplekey2')": value,}

应该是:

{('tuplekey1','tuplekey2'): value,} 

(如果问题不清楚,请不要投票,如果需要的话,我会尽力澄清...我不在这里经常发问。)

1 个答案:

答案 0 :(得分:2)

如果要使用shelvejson保存数据,则不能将字典用作字典键。因此,在您的情况下,使用元组的字符串表示形式而不是实际的元组-repr(('tuplekey1', 'tuplekey2'))给出"('tuplekey1', 'tuplekey2')"

因此,您需要执行其他步骤才能将字符串解析为元组。例如,eval("('tuplekey1', 'tuplekey2')")tuple(val.strip("()' ") for val in a.split(','))。当然,您需要知道(或识别)应将哪些字符串解析为元组。

可以避免该问题-数据应以其他方式存储-元组的另一种表示形式或数据的另一种结构。