Помогите пожалуйста с решением задачи на Python
Найдите различия между двумя JSON-файлами. Если различающиеся параметры входят в diff_list, выведите различие. Иными словами, вам нужно отловить изменение определённых параметров и вывести значение: что изменилось и на что. Набор ключей в обоих файлах идентичный, различаются лишь значения.
Напишите программу, которая:
загружает данные из двух предложенных JSON-файлов;
выполняет сравнение параметров, указанных в diff_list;
формирует результат в виде словаря;
записывает словарь в JSON-файл с названием result.json.
Помимо вывода в консоль, должен быть сформирован JSON-файл с получившимся словарём (result.json).
Данные, загруженные из json_old.json:
{'company_id': 111111, 'resource': 'record', 'resource_id': 406155061, 'status': 'create', 'data': {'id': 11111111, 'company_id': 111111, 'services': [{'id': 9035445, 'title': 'Стрижка', 'cost': 1500, 'cost_per_unit': 1500, 'first_cost': 1500, 'amount': 1}], 'goods_transactions': [], 'staff': {'id': 1819441, 'name': 'Мастер'}, 'client': {'id': 130345867, 'name': 'Клиент', 'phone': '79111111111', 'success_visits_count': 2, 'fail_visits_count': 0}, 'clients_count': 1, 'datetime': '2022-01-25T11:00:00+03:00', 'create_date': '2022-01-22T00:54:00+03:00', 'online': False, 'attendance': 0, 'confirmed': 1, 'seance_length': 3600, 'length': 3600, 'master_request': 1, 'visit_id': 346427049, 'created_user_id': 10573443, 'deleted': False, 'paid_full': 0, 'last_change_date': '2022-01-22T00:54:00+03:00', 'record_labels': '', 'date': '2022-01-22 10:00:00'}}
Данные, загруженные из json_new.json:
{'company_id': 111111, 'resource': 'record', 'resource_id': 406155061, 'status': 'create', 'data': {'id': 11111111, 'company_id': 111111, 'services': [{'id': 22222225, 'title': 'Стрижка', 'cost': 1500, 'cost_per_unit': 1500, 'first_cost': 1500, 'amount': 1}], 'goods_transactions': [], 'staff': {'id': 1819441, 'name': 'Мастер'}, 'client': {'id': 130345867, 'name': 'Клиент', 'phone': '79111111111', 'success_visits_count': 2, 'fail_visits_count': 0}, 'clients_count': 1, 'datetime': '2022-01-25T13:00:00+03:00', 'create_date': '2022-01-22T00:54:00+03:00', 'online': False, 'attendance': 2, 'confirmed': 1, 'seance_length': 3600, 'length': 3600, 'master_request': 1, 'visit_id': 346427049, 'created_user_id': 10573443, 'deleted': False, 'paid_full': 1, 'last_change_date': '2022-01-22T00:54:00+03:00', 'record_labels': '', 'date': '2022-01-22 10:00:00'}}
Результат
print(result)
В консоли должно вывестись следующее сообщение:
{'services': [{'id': 22222225, 'title': 'Стрижка', 'cost': 1500, 'cost_per_unit': 1500, 'first_cost': 1500, 'amount': 1}], 'datetime': '2022-01-25T13:00:00+03:00'}
import json
# Загрузка данных из JSON-файлов
with open('json_old.json', 'r') as f:
old_data = json.load(f)
with open('json_new.json', 'r') as f:
new_data = json.load(f)
# Определение списка ключей для сравнения
diff_list = ['services', 'datetime']
# Инициализация словаря результата
result = {}
# Сравнение значений ключей в diff_list
for key in diff_list:
if old_data['data'][key] != new_data['data'][key]:
result[key] = new_data['data'][key]
# Вывод результата
print(result)
# Запись результата в JSON-файл
with open('result.json', 'w') as f:
json.dump(result, f, ensure_ascii=False, indent=4)
Эта программа загружает данные из двух JSON-файлов, json_old.json и json_new.json, и сравнивает значения ключей, указанных в diff_list. Если значения отличаются, новое значение добавляется в словарь result. Результат затем выводится на консоль и записывается в JSON-файл с именем result.json.
import json
from typing import Any, Dict, Union
def get_nested_value(data: Dict[str, Any], path: str) -> Any:
"""Получает значение из словаря по вложенному пути (например, 'services.0.cost')."""
keys = path.split('.')
for key in keys:
if isinstance(data, list) and key.isdigit():
data = data[int(key)]
elif isinstance(data, dict):
data = data.get(key, None)
else:
return None
if data is None:
return None
return data
def compare_data(old_data: Dict[str, Any], new_data: Dict[str, Any], diff_list: list) -> Dict[str, Any]:
result = {}
for key in diff_list:
old_val = get_nested_value(old_data, f"data.{key}")
new_val = get_nested_value(new_data, f"data.{key}")
if old_val != new_val:
result[key] = new_val
return result
# Загрузка данных
with open('json_old.json', 'r', encoding='utf-8') as f:
old_data = json.load(f)
with open('json_new.json', 'r', encoding='utf-8') as f:
new_data = json.load(f)
# Сравниваем как вложенные ключи (например, 'services.0.cost')
# diff_list = ["services.0.cost", "datetime"]
diff_list = ["services", "staff", "datetime"]
result = compare_data(old_data, new_data, diff_list)
# Вывод результата
print(json.dumps(result, ensure_ascii=False))
# Запись результата
with open('result.json', 'w', encoding='utf-8') as f:
json.dump(result, f, ensure_ascii=False, indent=4)