отдельный словарь в нескольких файлах JSON - PullRequest
0 голосов
/ 17 мая 2019

У меня есть несколько файлов 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'])

Заранее спасибо

1 Ответ

1 голос
/ 17 мая 2019

Не уверен, что я достаточно хорошо понимаю, что вам нужно, но попробуйте это:

def separate(merged, originals):
    separated = [{} for _ in range(len(originals))]

    for sep, org in zip(separated, originals):
        for key, val in merged.items():
            if key in org:
                if type(org[key]) != type(val):
                    raise RuntimeError("Types changed, not sure what to do")
                if isinstance(org[key], dict):
                    sep[key] = separate(val, [org[key]])[0]
                else:
                    sep[key] = val
    return separated

Он не имеет дело с чтением / записью файлов, потому что он должен повторяться, но вы можете справиться с этимя думаю, что в твоем собственном месте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...