#!/usr/bin/env python3 """ Скрипт объединения нескольких JSON-файлов в один. Файлы должны лежать в том же каталоге, что и скрипт. Каждый файл — один JSON-объект; результат — один объект, собранный из верхнеуровневых ключей всех файлов. При совпадении ключей побеждает значение из файла, идущего позже в списке. """ import argparse import json from pathlib import Path def get_script_dir() -> Path: """Возвращает каталог, в котором расположен скрипт.""" return Path(__file__).resolve().parent def merge_json_files( filenames: list[str], base_dir: Path, output_path: Path, indent: int | None = 2, ) -> None: """ Читает перечисленные JSON-файлы из base_dir и записывает объединённый объект в output_path. Args: filenames: Список имён файлов (без пути). base_dir: Каталог с входными файлами. output_path: Полный путь к результирующему JSON-файлу. indent: Отступ для форматирования JSON (по умолчанию 2). Raises: FileNotFoundError: Если какой-либо входной файл не найден. json.JSONDecodeError: Если содержимое файла не является валидным JSON. """ result: dict = {} for name in filenames: path = base_dir / name if not path.is_file(): raise FileNotFoundError(f"Файл не найден: {path}") with open(path, "r", encoding="utf-8") as f: data = json.load(f) if not isinstance(data, dict): raise TypeError( f"Файл {name} должен содержать JSON-объект (dict), получен: {type(data).__name__}" ) result.update(data) with open(output_path, "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False, indent=indent) def main() -> None: """Точка входа: разбор аргументов и вызов объединения.""" script_dir = get_script_dir() parser = argparse.ArgumentParser( description="Объединить несколько JSON-файлов из каталога скрипта в один файл." ) parser.add_argument( "files", nargs="+", metavar="FILE", help="Имена JSON-файлов (в каталоге скрипта)", ) parser.add_argument( "-o", "--output", default="merged.json", metavar="OUTPUT", help="Имя результирующего файла (по умолчанию: merged.json)", ) parser.add_argument( "--no-indent", action="store_true", help="Не форматировать вывод (компактный JSON)", ) args = parser.parse_args() output_path = script_dir / args.output indent = None if args.no_indent else 2 merge_json_files( filenames=args.files, base_dir=script_dir, output_path=output_path, indent=indent, ) print(f"Записано: {output_path}") if __name__ == "__main__": main()