Мне нужна помощь, пытаясь использовать difflib для сравнения двух dicts. Моя программа принимает 2 файла json, преобразует их в python dicts. Затем я хотел бы использовать difflib для двух dicts, чтобы отобразить различия между ними.difflib сравнить два словаря python
Каков правильный способ использования difflib для этого?
#!/usr/bin/env python2
import json
import collections
import difflib
import pprint
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 convert(data):
if isinstance(data, basestring):
return str(data)
elif isinstance(data, collections.Mapping):
return dict(map(convert, data.iteritems()))
elif isinstance(data, collections.Iterable):
return type(data)(map(convert, data))
else:
return data
def main():
json1 = get_json()
json2 = get_json()
json1_dict = convert(json1)
json2_dict = convert(json2)
result = list(difflib.Differ.compare(json1_dict, json2_dict))
pprint.pprint(result)
if __name__ == "__main__":
main()
JSON Пример:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": [
"GML",
"XML"
]
},
"GlossSee": "markup"
}
}
}
}
}
И изменить значение ID в «1234» во втором файле
Я хотел сравнить два и получить и выход что-то вроде:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
- "ID": "SGML",
+ "ID": "1234",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": [
"GML",
"XML"
]
},
"GlossSee": "markup"
}
}
}
}
}
'Differ.compare' - это метод экземпляра. Есть ли какая-то цель для вашей функции 'convert', кроме как избавиться от строк unicode? Во всяком случае, 'difflib' работает над последовательностями строк, а не на любых объектах, таких как словари. Какой контент у ваших json-файлов? Что вы ожидаете от вывода вашей программы? – Blckknght
Я не думаю, что это то, для чего нужен difflib; он предназначен для создания различий между текстовыми файлами. Какова структура ваших файлов JSON? Являются ли они только 2 уровня (или так), или вам потребуется рекурсивное решение? – dstromberg
Функция преобразования только для того, чтобы избавиться от юникода, есть ли лучший способ сделать это? Я отредактирую вопрос с примерами json-файлов и ожидаемого вывода. – user3230554