LangChain教程:Docx2txtLoader读取word(.docx)文件

介绍

基于 docx2txt 库封装的 Word 文件加载器,继承自 LangChain BaseLoader,输出标准化 Document 对象;

提取 .docx 文件中的纯文本内容(忽略图片、表格格式,仅保留文本和段落分隔);

优势

轻量、速度快、依赖少(仅需 docx2txt 库);

⚠️ 局限

  1. 仅支持 .docx 格式,不支持 .doc 旧格式;
  2. 不保留表格、图片、公式等非文本内容(表格会转为纯文本分行显示);
  3. 元数据仅包含文件路径,无页码、段落等详细信息。

适用场景

  • 快速提取 Word 文档纯文本(如报告、合同、笔记);
  • 对格式无要求的 Word 文档问答/总结;
  • 批量处理大量简单 Word 文档(如企业规章制度、员工手册)。

不适用场景

  • 需要保留表格结构、图片描述的复杂 Word 文档;
  • 需提取页码、字体样式等格式信息的场景(建议用 UnstructuredWordDocumentLoader);
  • 处理 .doc 旧格式文件(需先转换为 .docx)。

安装

pip 安装

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类型: <class 'list'>
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类型: <class 'list_iterator'>
-----元数据: {'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 纯文本」的核心目标。

原文出处:/show_1GW2rOkMiFOk.html