LangChain教程:Docx2txtLoader读取word(.docx)文件 作者:马育民 • 2026-02-28 09:36 • 阅读:10001 # 介绍 基于 `docx2txt` 库封装的 Word 文件加载器,继承自 LangChain `BaseLoader`,输出标准化 `Document` 对象; 提取 `.docx` 文件中的纯文本内容(忽略图片、表格格式,仅保留文本和段落分隔); ### 优势 轻量、速度快、依赖少(仅需 `docx2txt` 库); ### ⚠️ 局限 1. 仅支持 .docx 格式,不支持 .doc 旧格式; 2. 不保留表格、图片、公式等非文本内容(表格会转为纯文本分行显示); 3. 元数据仅包含文件路径,无页码、段落等详细信息。 ### 适用场景 - 快速提取 Word 文档纯文本(如报告、合同、笔记); - 对格式无要求的 Word 文档问答/总结; - 批量处理大量简单 Word 文档(如企业规章制度、员工手册)。 ### 不适用场景 - 需要保留表格结构、图片描述的复杂 Word 文档; - 需提取页码、字体样式等格式信息的场景(建议用 `UnstructuredWordDocumentLoader`); - 处理 .doc 旧格式文件(需先转换为 .docx)。 # 安装 ### pip 安装 ```bash pip install docx2txt ``` ### poetry 虚拟环境安装 ``` poetry add docx2txt ``` # 使用 ### 创建对象 ``` Docx2txtLoader(file_path=word文件路径) ``` **关键参数**: - `file_path`(必填):.docx 文件的路径(绝对路径/相对路径,如 `"企业报告.docx"`); ### load():一次性加载小文件 同步加载整个 `.docx` 文件的纯文本内容 **返回值:** `List[Document]`(默认1个 `Document`)。 >**提示:**搭配 `DirectoryLoader` 使用时,会有多个 `Document` **使用场景**: - 小文件(几KB~几十KB,如短篇企业报告、规章制度); - 快速验证加载效果、提取纯文本; - 无需分批处理的场景。 **特点**: - 最简单、最常用,开箱即用; - 返回的 Document 包含:`page_content`(全部纯文本)、`metadata`(仅文件路径)。 ### 例子 ``` from langchain_community.document_loaders import Docx2txtLoader # 1. 初始化加载器(指定文件路径+编码) loader = Docx2txtLoader( file_path="../../企业报告(短).docx", # 必传:Word文件路径 ) # 2. 加载文件(核心通用方法) # 一次性加载(小文件) docs = loader.load() print("docs类型:", type(docs)) print("docs长度:", len(docs)) print("元数据:", docs[0].metadata) # 元数据(仅包含文件路径) print("-"*50) print("文本内容:", docs[0].page_content) # 提取的纯文本 ``` 执行结果: ``` docs类型: docs长度: 1 元数据: {'source': '../../企业报告(短).docx'} ``` # 加载大文件 ### lazy_load():分批加载大文件 返回生成器,分批加载文件内容(原生默认仅1批,仍返回1个 `Document` ;需结合拆分逻辑才会多批)。 **使用场景**: - 大体积 .docx 文件(如几十MB、万字以上报告); - 内存敏感场景(如低配服务器); - 需逐批处理文本的场景(如加载一批、拆分一批)。 **特点**: - 内存友好,避免一次性加载大文件导致溢出; - 生成器遍历方式:`for doc in loader.lazy_load():`。 ### 例子 ``` from langchain_community.document_loaders import Docx2txtLoader # 1. 初始化加载器(指定文件路径+编码) loader = Docx2txtLoader( file_path="../../企业报告(短).docx", # 必传:Word文件路径 ) # 2. 加载文件(核心通用方法) # 方式2:分批加载(大文件,返回生成器) docs = loader.lazy_load() print("docs类型:", type(docs)) ``` ##### 查看结果方式一 ``` # 3. 查看结果方式一 for doc in docs: print("-----元数据:", doc.metadata) # 元数据(仅包含文件路径) print("文本内容:", doc.page_content) # 提取的纯文本 ``` ##### 查看结果方式二 ``` # 3. 查看结果方式二 # 获取唯一的 Document 对象 doc = next(docs) print("-----元数据:", doc.metadata) # 元数据(仅包含文件路径) print("文本内容:", doc.page_content) # 提取的纯文本 ``` ##### 执行结果 ``` docs类型: -----元数据: {'source': '../../企业报告(短).docx'} 下面是文件内容:略 ``` # 方法选择 | 场景 | 首选方法组合 | 核心目的 | |-------------------------------|---------------------------------------|------------------------------| | 小文件快速加载 | `__init__()` + `load()` | 简单提取纯文本 | | 大文件内存友好加载 | `__init__()` + `lazy_load()` | 分批加载,避免溢出 | | RAG 知识库构建(长文本)| `__init__()` + `load()` + 文本分割器 | 拆分文本,适配大模型 | | 生产环境加载 | 上述组合 + 异常处理 | 保证程序健壮性 | # 注意 1. `Docx2txtLoader` 本身 **无内置拆分方法**,生成多个 Document 必须结合文本分割器; 2. `lazy_load()` 原生仅返回1批(1个 Document),需自定义扩展才会多批; 3. 所有方法均继承自 `BaseLoader`,和其他加载器(如 CSVLoader)用法完全统一,无需额外学习。 # 与其他 Word 加载器对比 | 加载器名称 | 核心差异 | 格式保留 | 依赖复杂度 | 速度 | |-------------------------------------|---------------------------|----------|------------|------| | **Docx2txtLoader** | 仅提取纯文本 | ❌ 无 | 低(仅docx2txt) | 快 | | UnstructuredWordDocumentLoader | 保留基础段落/表格结构 | ✅ 基础 | 中(需unstructured) | 中 | | PyMuPDFLoader(转换为PDF后加载)| 保留更多格式(需转PDF)| ✅ 较多 | 中(需PyMuPDF) | 中 | # 常见问题 | 问题 | 解决方案 | |---------------------|--------------------------------------------------------------------------| | 提取不到文本 | 确认文件是 .docx 格式(.doc 需转换),且文件未加密/损坏 | | 大文件内存溢出 | 使用 `lazy_load()` 分批加载,而非 `load()` 一次性加载 | | 需提取表格内容 | 先用 `Docx2txtLoader` 提取文本,再用大模型解析表格文本;或换用 `UnstructuredWordDocumentLoader` | # 总结 1. **核心三板斧**:`__init__()`(配置) + `load()`(小文件) + `lazy_load()`(大文件)是 `Docx2txtLoader` 的基础,覆盖80%场景; 2. **进阶必备**:结合文本分割器拆分文本,是 RAG 场景的标配; 3. **生产环境**:补充异常处理,避免路径、权限、格式问题导致加载失败; 4. **核心特点**:所有方法均轻量、无冗余,聚焦「快速提取 Word 纯文本」的核心目标。 原文出处:http://malaoshi.top/show_1GW2rOkMiFOk.html