Diccionario recursivo progtwig de comparación

Creé un progtwig que compara dos diccionarios de Python y genera las diferencias de los dos. Funciona con un dict que tiene una profundidad de 2 o menos. ¿Qué debo hacer para poder manejar los dictados con más profundidad, también los dictados nesteds?

Otro problema que tengo es que cuando paso una matriz json a través de mi función get_json (), se devuelve como una lista. Y el progtwig está saliendo con la lista en lugar de con un dict. ¿Cómo debo ir para resolver eso?

Mi progtwig:

#!/usr/bin/env python2 import json def get_json(): file_name = raw_input("Enter name of JSON File: ") with open(file_name) as json_file: json_data = json.load(json_file) return json_data def print_diff(json1, json2): for n in json1: if n not in json2: print('- "' + str(n) + '":') for n in json2: if n not in json1: print('+ "' + str(n) + '":') continue if json2[n] != json1[n]: if type(json2[n]) not in (dict, list): print('- "' + str(n) + '" : "' + str(json1[n])) print('+ "' + str(n) + '" : "' + str(json2[n])) else: if type(json2[n]) == dict: print_diff(json1[n], json2[n]) continue return def main(): file1 = get_json() print(type(file1)) file2 = get_json() print(type(file2)) print_diff(file1, file2) if __name__ == "__main__": main() 

ejemplo de dict 1:

 { "widget": { "debug": "on", "window": { "title": "Sample Konfabulator Widget", "name": "main_window", "width": 500, "height": 500 }, "image": { "src": "Images/Sun.png", "name": "sun1", "hOffset": 250, "vOffset": 250, "alignment": "center" }, "text": { "data": "Click Here", "size": 36, "style": "bold", "name": "text1", "hOffset": 250, "vOffset": 100, "alignment": "center", "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" } } } 

ejemplo de dict 2:

 { "widget": { "debug": "on", "window": { "title": "Sample Konfabulator Widget", "name": "main_window", "width": 500, "height": 500 }, "image": { "src": "Images/Sun.png", "name": "sun2", "hOffset": 100, "vOffset": 100, "alignment": "center" }, "text": { "data": "Click Here", "size": 36, "style": "bold", "name": "text1", "hOffset": 250, "vOffset": 100, "alignment": "center", "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" } } } 

salida de ejemplo:

 Enter name of JSON File: JSON1.json  Enter name of JSON File: JSON2.json  - "vOffset" : "250 + "vOffset" : "100 - "name" : "sun1 + "name" : "sun2 - "hOffset" : "250 + "hOffset" : "100 

He escrito el siguiente código que puede comparar dos diccionarios con diferentes profundidades e imprimir las diferencias en la salida de la consola. Tenga en cuenta que, si la clave se encuentra en el primer diccionario y no se encuentra en el segundo, solo imprimirá la clave que no se encuentra (no se imprimirá debajo del árbol). Espero que esto sea lo que esperaba. Este código funciona para la comparación de una manera, por lo que necesita hacer dos llamadas para comparar el diccionario de otra manera.

 def findDiff(d1, d2, path=""): for k in d1.keys(): if not d2.has_key(k): print path, ":" print k + " as key not in d2", "\n" else: if type(d1[k]) is dict: if path == "": path = k else: path = path + "->" + k findDiff(d1[k],d2[k], path) else: if d1[k] != d2[k]: print path, ":" print " - ", k," : ", d1[k] print " + ", k," : ", d2[k] print "comparing s1 to s2:" print findDiff(s1,s2) print "comparing s2 to s1:" print findDiff(s2,s1) 

Salida::

 comparing s1 to s2: widget->text : data as key not in d2 widget->text->window->image : - vOffset : 250 + vOffset : 100 widget->text->window->image : - name : sun1 + name : sun2 widget->text->window->image : - hOffset : 250 + hOffset : 100 None comparing s2 to s1: widget->text->window->image : - vOffset : 100 + vOffset : 250 widget->text->window->image : - name : sun2 + name : sun1 widget->text->window->image : - hOffset : 100 + hOffset : 250 None 

Tenga en cuenta que, en su pregunta que no ha considerado si hay una diferencia en la clave, la ruta de acceso de la clave no se imprime. Lo estoy imprimiendo en mi código. He eliminado el elemento de datos de widget-> texto para la prueba. entonces, los pls ignoran esta salida de consola

Sin leer todo a muchas de tus cosas,

 def check_dict(first, second): for key in first: for keyTwo in second: if type(first[key]) == dict and type(second[keyTwo]) == dict: return check_dict(first[key], second[keyTwo]) if not first[key] == second[keyTwo]: return false 

No tengo acceso a un intérprete de python en este momento pero algo como esto debería funcionar. Es solo el comienzo de una idea, pero espero que esto sea suficiente información para provocar algo.