Acceso recursivo a rutas y valores de un diccionario nested

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:

  • La primera fila solo imprime las claves ( dict_id , person['person_id'] , person['name'] , family['members']['father'] )
  • La segunda fila imprime los valores respectivamente (5, 15, “Martin”, “Jose”)

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,[]'