将嵌套的dictproxy指令转换为JSON文件的指令

pu3pd22g  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(277)

我有一个很大的嵌套dict nested_dict,它是使用并行处理创建的,在每一层都有DictProxy对象。为了避免重新运行这个dict的创建过程(需要花费数小时),我希望将所有内容保存在JSON文件中。根据How to convert a DictProxy object into JSON serializable dict?,可以将DictProxy对象转换为dict,然后将其设置为JSON。但由于我有嵌套的DictProxy对象,运行json.dumps(nested_dict.copy())将返回TypeError: Object of type DictProxy is not JSON serializable
是否有一种有效的方法可以递归地将所有DictProxy对象转换为dict,以便保存在JSON文件中?

cclgggtu

cclgggtu1#

下面介绍一些dict理解和一些递归:

from multiprocessing import Manager
from multiprocessing.managers import DictProxy

def get_value(d):
    return {
        key: get_value(sub_d)
        if isinstance(sub_d, DictProxy) else sub_d 
        for key, sub_d in d.items()
            }

if __name__ == "__main__":

    with Manager() as manager:

        d1, d2, d3 = manager.dict(), manager.dict(), manager.dict()

        d3['d'] = 'end of nested levels'
        d2['d3'] = d3
        d1['d2'] = d2

        print(d1)
        print(get_value(d1))
    • 产出**
{'d2': <DictProxy object, typeid 'dict' at 0x236493f1f70>}
{'d2': {'d3': {'d': 'end of nested levels'}}}

另外,即使没有DictProxy对象或字典没有嵌套,这种方法也能正常工作

brccelvz

brccelvz2#

只需创建一个新的空dict,然后使用for循环填充它,直到最内层的dict解决它:

new_dict = {}
for first_key in nested_dict.keys():
    new_dict[first_key] = {}
    for second_key in nested_dict[first_key].keys():
        new_dict[first_key][second_key] = {}
        ...
        for last_key in nested_dict[first_key][second_key][...][last_key].keys():
            new_dict[first_key][second_key][...][last_key] = a_dictproxy_object.copy()

然后

import json
with open("my.json","w") as f:
    json.dump(new_dict,f)

也许这不是最有效的,但它的工作!

相关问题