En Python 2.7, ¿cómo se accede e imprime dinámicamente las claves y los valores de un diccionario nested? Aquí hay un ejemplo sin sentido: https://jsoneditoronline.org/?id=da7a486dc2e24bf8b94add9f04c71b4d
Normalmente, yo haría algo como:
import json json_sample = 'sample_dict.json' json_file = open(json_sample, 'r') json_data = json.load(json_file) items = json_data['sample_dict'] for item in items: dict_id = item['dict_id'] person = item['person']['person_id'] family = item['family']['members'] print dict_id print person print family
Puedo codificarlo de esta manera y me dará resultados deseables, pero ¿cómo podría acceder a cada una de las claves y valores de forma dinámica para que:
dict_id
, person['person_id']
, person['name']
, family['members']['father']
) El resultado final debe estar en un archivo CSV.
Puede utilizar un visitante / generador recursivo que devuelva todos los pares de ruta / valor de las hojas:
def visit_dict(d, path=[]): for k, v in d.items(): if not isinstance(v, dict): yield path + [k], v else: yield from visit_dict(v, path + [k])
(Reemplace el yield from ...
con el equivalente apropiado si usa Python <3.4)
Obteniendo las llaves:
>>> ','.join('/'.join(k) for k, v in visit_dict(json_data['sample_dict'][0])) 'dict_id,person/person_id,person/name,person/age,family/person_id,family/members/father,family/members/mother,family/members/son,family/family_id,items_id,furniture/type,furniture/color,furniture/size,furniture/purchases'
y los valores:
>>> ','.join(str(v) for k, v in visit_dict(json_data['sample_dict'][0])) '5,15,Martin,18,20,Jose,Maddie,Jerry,2,None,Chair,Brown,Large,[]'