"""TXT/MD 文件解析器,使用 charset-normalizer 自动检测编码""" import os from typing import List from charset_normalizer import detect from exceptions import ParseError from parsers.base import BaseParser class TextParser(BaseParser): """纯文本和 Markdown 文件解析器""" def supported_extensions(self) -> List[str]: return [".txt", ".md"] def parse(self, file_path: str) -> str: """ 解析文本文件,自动检测编码并返回文本内容。 参考 MaxKB TextSplitHandle.get_content() 核心逻辑: 读取文件字节 → charset_normalizer 检测编码 → 解码返回文本 Args: file_path: 文件路径 Returns: 文件的文本内容 Raises: ParseError: 文件无法读取或编码检测失败时抛出 """ file_name = os.path.basename(file_path) try: with open(file_path, "rb") as f: buffer = f.read() except Exception as e: raise ParseError(file_name, f"文件读取失败: {e}") if len(buffer) == 0: return "" result = detect(buffer) encoding = result.get("encoding") if encoding is None: raise ParseError(file_name, "无法检测文件编码") try: return buffer.decode(encoding) except Exception as e: raise ParseError(file_name, f"编码解码失败 ({encoding}): {e}")