| import json | |
| import os | |
| from typing import Any | |
| def save_to_json(data: Any, file_path: str, indent: int = 4) -> None: | |
| """ | |
| 将数据保存到JSON文件中。 | |
| Args: | |
| data (Any): 要保存的数据,通常是字典或列表。 | |
| file_path (str): 保存JSON文件的路径。 | |
| indent (int): 缩进级别,默认为4,用于格式化JSON文件。 | |
| Raises: | |
| IOError: 当文件无法写入时抛出异常。 | |
| """ | |
| try: | |
| with open(file_path, 'w', encoding='utf-8') as f: | |
| json.dump(data, f, ensure_ascii=False, indent=indent) | |
| print(f"数据已成功保存到 {file_path}") | |
| except IOError as e: | |
| print(f"保存到文件 {file_path} 失败: {e}") | |
| exit() | |
| def load_from_json(file_path: str) -> Any: | |
| """ | |
| 从JSON文件中读取数据。 | |
| Args: | |
| file_path (str): 要读取的JSON文件路径。 | |
| Returns: | |
| Any: 读取的JSON数据,通常是字典或列表。 | |
| Raises: | |
| IOError: 当文件无法读取时抛出异常。 | |
| json.JSONDecodeError: 当JSON格式错误时抛出异常。 | |
| """ | |
| try: | |
| with open(file_path, 'r', encoding='utf-8') as f: | |
| data = json.load(f) | |
| print(f"数据已成功从 {file_path} 加载") | |
| return data | |
| except (IOError, json.JSONDecodeError) as e: | |
| print(f"读取文件 {file_path} 失败: {e}") | |
| exit() | |
| def append_to_json(data: Any, file_path: str) -> None: | |
| """ | |
| 向现有的JSON文件追加数据。如果文件不存在,则创建新文件。 | |
| Args: | |
| data (Any): 要追加的数据。 | |
| file_path (str): JSON文件的路径。 | |
| Raises: | |
| IOError: 当文件无法写入时抛出异常。 | |
| """ | |
| existing_data = load_from_json(file_path) or [] | |
| if isinstance(existing_data, list): | |
| existing_data.append(data) | |
| else: | |
| print(f"文件 {file_path} 的内容不是列表,无法追加数据。") | |
| exit() | |
| save_to_json(existing_data, file_path) | |
| def is_json(file_path: str) -> bool: | |
| """ | |
| 检查一个文件是否为有效的JSON文件。 | |
| Args: | |
| file_path (str): 文件路径。 | |
| Returns: | |
| bool: 如果文件是有效的JSON文件,返回True,否则返回False。 | |
| """ | |
| if not os.path.exists(file_path): | |
| return False | |
| try: | |
| with open(file_path, 'r', encoding='utf-8') as f: | |
| json.load(f) | |
| return True | |
| except (IOError, json.JSONDecodeError): | |
| return False | |
| def pretty_print_json(data: Any) -> None: | |
| """ | |
| 以漂亮格式打印JSON数据。 | |
| Args: | |
| data (Any): 要打印的JSON数据,通常是字典或列表。 | |
| """ | |
| print(json.dumps(data, ensure_ascii=False, indent=4)) | |
| def print_json_by_index(file_path: str, index: int) -> None: | |
| """ | |
| 打印JSON文件中的第index条数据。 | |
| Args: | |
| file_path (str): JSON文件的路径。 | |
| index (int): 要打印的条目索引,从0开始。 | |
| Raises: | |
| IndexError: 如果索引超出列表范围,将抛出异常。 | |
| """ | |
| data = load_from_json(file_path) | |
| if data is None: | |
| print("无法加载数据") | |
| return | |
| if not isinstance(data, list): | |
| print("JSON文件的内容不是列表格式,无法按索引访问") | |
| return | |
| try: | |
| item = data[index] | |
| pretty_print_json(item) | |
| except IndexError: | |
| print(f"索引 {index} 超出范围。该JSON文件仅包含 {len(data)} 条数据。") | |