У меня есть несколько файлов JSON. Я объединяю файлы в уникальный словарь.
Что я хочу, так это сохранить этот словарь обратно в файлы json, сохраняя структуру.
Представьте, что у вас есть эти файлы:
dict_common.json
{
"common": {
"subcommon1_dict": {
"a": 1,
"b": 2
},
"subcommon1_list": [
"a",
"b",
"c"
]
}
}
dict_var1.json
{
"var1": {
"subvar1_dict": {
"a": 1,
"b": 2
},
"subvar1_list": [
"a",
"b",
"c"
]
}
}
dictmerge.py
import collections
import json
def dict_merge(dct, merge_dct, add_keys=True):
# from: https://gist.github.com/angstwad/bf22d1822c38a92ec0a9
""" Recursive dict merge. Inspired by :meth:``dict.update()``, instead of
updating only top-level keys, dict_merge recurses down into dicts nested
to an arbitrary depth, updating keys. The ``merge_dct`` is merged into
``dct``.
This version will return a copy of the dictionary and leave the original
arguments untouched.
The optional argument ``add_keys``, determines whether keys which are
present in ``merge_dict`` but not ``dct`` should be included in the
new dict.
Args:
dct (dict) onto which the merge is executed
merge_dct (dict): dct merged into dct
add_keys (bool): whether to add new keys
Returns:
dict: updated dict
"""
dct = dct.copy()
if not add_keys:
merge_dct = {
k: merge_dct[k]
for k in set(dct).intersection(set(merge_dct))
}
for k, v in merge_dct.items():
if (k in dct and isinstance(dct[k], dict)
and isinstance(merge_dct[k], collections.Mapping)):
dct[k] = dict_merge(dct[k], merge_dct[k], add_keys=add_keys)
else:
dct[k] = merge_dct[k]
return dct
def createdictfromjsonfiles(files):
dict = {}
for f in files:
with open(f) as file:
dict = dict_merge(dict, json.load(file))
return dict
main.py
import json
from dictmerge import createdictfromjsonfiles
def printdict(d):
print(json.dumps(d, indent=4, sort_keys=True))
print('Merge dict..')
mydict = createdictfromjsonfiles(['dict_common.json', 'dict_var1.json'])
printdict(mydict)
print('Edit dict..')
mydict['common']['subcommon1_dict']['a'] = 999
mydict['var1']['subvar1_list'].append(999)
printdict(mydict)
Теперь я хочу отделить mydict и сохранить значение в исходном файле json.
Я пытаюсь перебрать mydict, проверить, существует ли ключ в файле json, и если true, сохранить значение в json, но я понятия не имею, как структурировать код.
separate(mydict, ['dict_common.json', 'dict_var1.json'])
Заранее спасибо