""" 文件I/O处理器模块 提供统一的文件读写接口,支持多种文件格式 """ import asyncio import aiofiles import json import os import re from pathlib import Path from typing import Any class FileIOHandler: """ 文件I/O处理器:统一管理文件的读写 提供JSON和纯文本的读写功能,可扩展支持其他格式 使用示例: >>> handler = FileIOHandler() >>> data = handler.read_json("input.json") >>> handler.write_json(data, "output.json") """ @staticmethod def string_to_json(data: str) -> Any: """ 将字符串转换为JSON """ try: json_data = re.sub(r'^```json|\n```$', '', data, flags=re.MULTILINE).strip() if not json_data: json_data = data return json.loads(json_data) except Exception as e: raise e @staticmethod def read_json(file_path: str) -> Any: """ 读取JSON文件 Args: file_path: 文件路径 Returns: 解析后的JSON数据 Raises: FileNotFoundError: 文件不存在 json.JSONDecodeError: JSON解析错误 """ if not os.path.exists(file_path): raise FileNotFoundError(f"文件不存在: {file_path}") with open(file_path, 'r', encoding='utf-8') as f: return json.load(f) @staticmethod def write_json(data: Any, file_path: str, indent: int = 2): """ 保存JSON文件 Args: data: 要保存的数据 file_path: 文件路径 indent: JSON缩进空格数 """ output_path = Path(file_path) output_path.parent.mkdir(parents=True, exist_ok=True) # 如果数据是字符串,则先转换为JSON if isinstance(data, str): data = FileIOHandler.string_to_json(data) with open(output_path, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=indent) @staticmethod async def write_json_async(data: Any, file_path: str, indent: int = 2): """ 异步保存JSON文件 Args: data: 要保存的数据 file_path: 文件路径 indent: JSON缩进空格数 """ output_path = Path(file_path) output_path.parent.mkdir(parents=True, exist_ok=True) async with aiofiles.open(output_path, 'w', encoding='utf-8') as f: await f.write(json.dumps(data, ensure_ascii=False, indent=indent)) @staticmethod def read_text(file_path: str) -> str: """ 读取文本文件 Args: file_path: 文件路径 Returns: 文件内容字符串 Raises: FileNotFoundError: 文件不存在 """ if not os.path.exists(file_path): raise FileNotFoundError(f"文件不存在: {file_path}") with open(file_path, 'r', encoding='utf-8') as f: return f.read() @staticmethod def write_text(content: str, file_path: str): """ 保存文本文件 Args: content: 要保存的内容 file_path: 文件路径 """ output_path = Path(file_path) output_path.parent.mkdir(parents=True, exist_ok=True) with open(file_path, 'w', encoding='utf-8') as f: f.write(content) @staticmethod async def write_text_async(content: str, file_path: str): """ 异步保存文本文件 Args: content: 要保存的内容 file_path: 文件路径 """ output_path = Path(file_path) output_path.parent.mkdir(parents=True, exist_ok=True) async with aiofiles.open(output_path, 'w', encoding='utf-8') as f: await f.write(content) @staticmethod def file_exists(file_path: str) -> bool: """ 检查文件是否存在 Args: file_path: 文件路径 Returns: bool: 文件是否存在 """ return os.path.exists(file_path)