一、核心定义、支持文件与适用场景

  • 定义:从本地磁盘读取各种格式文件,自动统一提取文本内容与元数据(如文件路径、名称、大小、修改时间等),适配 RAG 知识库构建的基础数据输入需求。
  • 支持文件类型:覆盖主流常用格式,包括 TXT / Markdown、PDF、Word DOCX、CSV、Excel(XLSX),可满足绝大多数本地文档读取需求。
  • 适用场景:RAG 知识库构建、本地文档批量解析、企业内部数据入库、离线文档检索等场景,是企业级 RAG 系统落地的基础数据来源。

二、分类型实战总结(LangChain + LlamaIndex 双框架)

1. 单类型文件读取

单类型读取:同一目录下只存在同一种格式的文件(全是 TXT、全是 PDF、全是 Word 或全是表格)。这种方式加载最简单、最稳定,也是企业知识库最常用的入库方式。

① TXT / Markdown

核心目标:读取纯文本类文档(TXT、Markdown),保留文本原有格式,提取完整元数据,支持单个或批量加载,适配笔记、说明文档等纯文本场景。

框架

核心加载器

关键操作

输出特点

LlamaIndex

SimpleDirectoryReader

指定数据目录、限定文件后缀(.txt/.md),配置中文编码,一键批量加载

元数据丰富(含文件路径、名称、类型、大小、创建/修改时间),可统计加载数量,输出文本前N字预览

LangChain

TextLoader / DirectoryLoader

TextLoader 加载单个文件,DirectoryLoader 批量加载,支持多线程加速,精准匹配文件后缀

元数据包含文件来源,支持单个/批量灵活加载,多线程提升批量处理效率

LlamaIndex 代码
from llama_index.core import SimpleDirectoryReader

# 读取单个/多个 txt/md 文件
documents = SimpleDirectoryReader(
    input_dir="./data",          # 数据目录
    required_exts=[".txt", ".md"], # 限定文件类型
    encoding="utf-8"             # 中文编码
).load_data()

# 查看结果
print(f"加载的文档数量: {len(documents)}")
print("第一篇文档元数据:", documents[0].metadata)
print("第一篇文档前200字:", documents[0].text[:200])
输出示例
加载的文档数量: 3
第一篇文档元数据: {'file_path': 'E:\\projectCursor\\博客\\RAG\\文档预处理\\file_test\\demo.txt', 'file_name': 'demo.txt', 'file_type': 'text/plain', 'file_size': 136, 'creation_date': '2026-04-14', 'last_modified_date': '2026-04-14'}
第一篇文档前200字: 这是一个演示文本,用于测试RAG数据加载流程。
RAG(检索增强生成)是大模型应用落地的核心范式。
LangChain 代码
from langchain_community.document_loaders import TextLoader, DirectoryLoader

# 1. 加载单个文件
loader = TextLoader("./data/demo.txt", encoding="utf-8")
doc = loader.load()
print("单个文件加载结果:")
print("元数据:", doc[0].metadata)
print("内容前100字:", doc[0].page_content[:100])

# 2. 批量加载目录下所有 TXT 文件
print("\n批量加载结果:")
loader = DirectoryLoader(
    path="./data",
    glob="**/*.txt",          # 匹配所有txt
    loader_cls=TextLoader,   # 指定加载器
    use_multithreading=True  # 多线程加速
)
docs = loader.load()
print(f"共加载 {len(docs)} 个txt文件")
输出示例
单个文件加载结果:
元数据: {'source': './data/demo.txt'}
内容前100字: 这是一个演示文本,用于测试RAG数据加载流程。

批量加载结果:
共加载 5 个txt文件
② PDF(纯文本)

核心目标:读取 PDF 文档,自动按页拆分,提取每一页的文本内容与元数据(页码、文件信息),适配手册、论文、报告等 PDF 类文档场景。

框架

核心加载器

关键操作

输出特点

LlamaIndex

SimpleDirectoryReader

指定数据目录、限定 .pdf 后缀,无需额外配置,自动按页读取

元数据含文件名称、路径、页码标签,可统计 PDF 总页数,输出每页文本前N字预览

LangChain

PyPDFLoader

指定单个 PDF 文件路径,通过 load_and_split() 方法按页拆分加载

元数据含文件来源、页码,按页拆分后可单独处理每一页内容,适配分页解析需求

LlamaIndex 代码
from llama_index.core import SimpleDirectoryReader

# 读取PDF文件
documents = SimpleDirectoryReader(
    input_dir="./data",
    required_exts=[".pdf"],
).load_data()

print(f"加载的PDF页数: {len(documents)}")
print("第一页元数据:", documents[0].metadata)
print("第一页内容前300字:", documents[0].text[:300])
输出示例
加载的PDF页数: 15
第一页元数据: {'file_name': 'handbook.pdf', 'file_path': './data/handbook.pdf', 'page_label': '1'}
第一页内容前300字: 公司产品手册
版本: V3.0
更新时间: 2024-12-01

产品概述
本产品是一款基于大模型的企业级智能问答系统,支持私有知识库接入、多轮对话、智能检索等功能。
LangChain 代码
from langchain_community.document_loaders import PyPDFLoader

# 加载PDF并拆分
loader = PyPDFLoader("./data/handbook.pdf")
pages = loader.load_and_split()  # 按页拆分

print(f"PDF总页数: {len(pages)}")
print("第1页元数据:", pages[0].metadata)
print("第1页内容前200字:", pages[0].page_content[:200])
输出示例
PDF总页数: 15
第1页元数据: {'source': './data/handbook.pdf', 'page': 0}
第1页内容前200字: 公司产品手册
版本: V3.0
更新时间: 2024-12-01

产品概述
本产品是一款基于大模型的企业级智能问答系统,支持私有知识库接入、多轮对话、智能检索等功能。
③ Word DOCX

核心目标:读取 Word 文档(DOCX 格式),提取正文内容与文件元数据,保留原有段落结构,适配工作报告、文案、规范等 Word 类文档场景。

框架

核心加载器

关键操作

输出特点

LlamaIndex

SimpleDirectoryReader

指定数据目录、限定 .docx 后缀,一键读取,无需额外配置

元数据含文件名称、路径,可统计加载的 DOCX 文件数量,保留正文段落结构

LangChain

Docx2txtLoader

指定单个 DOCX 文件路径,直接加载,自动提取正文

元数据含文件来源,完整提取正文内容,保留原有段落结构,适配文案类文档解析

LlamaIndex 代码
from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader(
    input_dir="./data",
    required_exts=[".docx"],
).load_data()

print(f"加载的DOCX数量: {len(documents)}")
print("第一篇文档元数据:", documents[0].metadata)
print("第一篇文档前200字:", documents[0].text[:200])
输出示例
加载的DOCX数量: 2
第一篇文档元数据: {'file_name': 'report.docx', 'file_path': './data/report.docx'}
第一篇文档前200字: 2024年度工作总结
报告人: 张三
部门: 技术研发部
时间: 2024-12-15

一、工作成果
1. 完成RAG系统核心模块开发
2. 优化向量检索性能,提升30%准确率
LangChain 代码
from langchain_community.document_loaders import Docx2txtLoader

loader = Docx2txtLoader("./data/report.docx")
docs = loader.load()

print("DOCX加载结果:")
print("元数据:", docs[0].metadata)
print("内容前300字:", docs[0].page_content[:300])
输出示例
DOCX加载结果:
元数据: {'source': './data/report.docx'}
内容前300字: 2024年度工作总结
报告人: 张三
部门: 技术研发部
时间: 2024-12-15

一、工作成果
1. 完成RAG系统核心模块开发
2. 优化向量检索性能,提升30%准确率
3. 搭建企业级知识库,包含1000+文档
④ CSV / Excel(表格数据)

核心目标:读取表格类文件(CSV、Excel),提取表格内容并转为文本格式,保留字段与数据对应关系,适配业务数据表、清单数据等场景。

框架

核心加载器

关键操作

输出特点

LlamaIndex

SimpleDirectoryReader

指定数据目录、限定 .csv/.xlsx 后缀,自动读取表格文件,无需区分格式

元数据含文件名称、路径,按文件整体读取,保留表格原始格式(行列对应),可批量加载多个表格文件

LangChain

CSVLoader / UnstructuredExcelLoader

CSVLoader 读取 CSV 文件,UnstructuredExcelLoader 读取 Excel 文件,分别处理不同表格格式

按行解析数据,元数据含文件来源、行号/页码,字段与数据对应清晰,适配业务数据解析

LlamaIndex 代码
from llama_index.core import SimpleDirectoryReader

# 读取CSV/Excel
documents = SimpleDirectoryReader(
    input_dir="./data",
    required_exts=[".csv", ".xlsx"],
).load_data()

print(f"加载的表格文件数: {len(documents)}")
for i, doc in enumerate(documents[:2]):  # 输出前2个
    print(f"\n第{i+1}个文件元数据:", doc.metadata)
    print(f"第{i+1}个文件内容前200字:", doc.text[:200])
输出示例
加载的表格文件数: 3
第1个文件元数据: {'file_name': 'data.csv', 'file_path': './data/data.csv'}
第1个文件内容前200字: id,name,category,value
1,产品A,技术,100
2,产品B,市场,200
3,产品C,运营,150
4,产品D,技术,120

第2个文件元数据: {'file_name': 'sales.xlsx', 'file_path': './data/sales.xlsx'}
第2个文件内容前200字: 日期,地区,销售额,利润
2024-01-01,北京,50000,15000
2024-01-02,上海,60000,18000
2024-01-03,广州,45000,13500
LangChain 代码
# CSV 读取
from langchain_community.document_loaders import CSVLoader
loader = CSVLoader("./data/data.csv")
docs = loader.load()
print("CSV加载结果:")
print("第一条数据元数据:", docs[0].metadata)
print("第一条数据内容:", docs[0].page_content)

# Excel 读取
print("\nExcel加载结果:")
from langchain_community.document_loaders import UnstructuredExcelLoader
loader = UnstructuredExcelLoader("./data/sales.xlsx")
excel_docs = loader.load()
print("Excel第一条数据元数据:", excel_docs[0].metadata)
print("Excel第一条数据内容:", excel_docs[0].page_content[:200])
输出示例
CSV加载结果:
第一条数据元数据: {'source': './data/data.csv', 'row': 0}
第一条数据内容: id: 1
name: 产品A
category: 技术
value: 100

Excel加载结果:
Excel第一条数据元数据: {'source': './data/sales.xlsx', 'page_number': 0}
Excel第一条数据内容: 日期: 2024-01-01
地区: 北京
销售额: 50000
利润: 15000

2. 多类型文件同时读取

核心目标:当一个目录内同时存在 PDF、Word、TXT、MD、CSV、Excel 等多种格式文件时,实现一次性批量加载所有文件,无需分别处理,提升数据入库效率。

框架

核心加载方式

关键操作

输出特点

LlamaIndex

SimpleDirectoryReader(自动识别)

指定数据目录,开启递归子文件夹功能,无需限定文件后缀,自动识别所有支持格式

可统计总加载文档数,输出文件类型分布,全自动处理,代码极简

LangChain

多加载器组合(自定义函数)

自定义加载函数,根据文件后缀判断,调用对应加载器(PyPDFLoader、Docx2txtLoader 等)批量加载

灵活可控,可根据需求自定义加载逻辑,适配复杂文件夹结构

LlamaIndex 代码(自动识别所有类型)
from llama_index.core import SimpleDirectoryReader

# 自动读取目录下所有支持的文件:pdf/txt/md/docx/csv/xlsx
documents = SimpleDirectoryReader(
    input_dir="./data",
    recursive=True,  # 递归子文件夹
).load_data()

print(f"共加载文档数: {len(documents)}")
print("文件类型分布:")
types = {}
for doc in documents:
    ext = doc.metadata.get('file_type', 'unknown')
    types[ext] = types.get(ext, 0) + 1
for k, v in types.items():
    print(f"  {k}: {v}个")
输出示例
共加载文档数: 25
文件类型分布:
  application/pdf: 15个
  text/plain: 5个
  application/vnd.openxmlformats-officedocument.wordprocessingml.document: 2个
  text/csv: 2个
  application/vnd.openxmlformats-officedocument.spreadsheetml.sheet: 1个
LangChain 代码(多类型批量加载)
from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader, TextLoader
import os

def load_all_files(path):
    docs = []
    for filename in os.listdir(path):
        fp = os.path.join(path, filename)
        # 根据文件后缀选择加载器
        if filename.endswith(".pdf"):
            loader = PyPDFLoader(fp)
            docs.extend(loader.load())
        elif filename.endswith(".docx"):
            loader = Docx2txtLoader(fp)
            docs.extend(loader.load())
        elif filename.endswith(".txt") or filename.endswith(".md"):
            loader = TextLoader(fp, encoding='utf-8')
            docs.extend(loader.load())
    return docs

documents = load_all_files("./data")
print(f"LangChain多类型加载结果: 共加载{len(documents)}个文档")
输出示例
LangChain多类型加载结果: 共加载25个文档

三、核心选型与注意事项

1. 框架选型逻辑

  • 追求简洁高效、一键操作:优先选择 LlamaIndex,无论是单类型还是多类型文件,均通过 SimpleDirectoryReader 实现,代码简洁,无需额外配置加载器,自动识别格式。
  • 需要灵活自定义、扩展加载逻辑:优先选择 LangChain,可根据文件后缀、文件夹结构自定义加载函数,适配复杂业务场景(如筛选特定文件、添加额外处理逻辑)。
  • 单类型批量加载:两种框架均可,LlamaIndex 配置更简单,LangChain 多线程加载更高效(适用于大量文本文件)。

2. 关键注意事项

  • 编码配置:读取 TXT/Markdown 等中文文本时,需配置 encoding="utf-8",避免出现中文乱码问题。
  • 路径配置:确保 input_dir(LlamaIndex)、path(LangChain)路径正确,指向本地文件所在目录,避免因路径错误导致加载失败。
  • 文件格式:确保文件格式与指定后缀一致(如 .docx 而非 .doc,.xlsx 而非 .xls),否则可能无法正常加载。
  • 递归加载:多类型文件读取时,若需加载子文件夹内文件,LlamaIndex 需开启 recursive=True,LangChain 需在自定义函数中添加递归逻辑。
  • 元数据差异:LlamaIndex 输出的元数据更丰富(含文件大小、创建/修改时间等),LangChain 元数据相对简洁(主要含文件来源),可根据需求选择。

四、总结

文档类型

框架

核心加载器/方式

代码特点

适用场景

TXT / Markdown

LlamaIndex

SimpleDirectoryReader

指定后缀 .txt/.md,自动批量加载

纯文本、笔记、说明文档

LangChain

TextLoader / DirectoryLoader

单个加载 + 目录批量,支持多线程

简单文本批量入库

PDF

LlamaIndex

SimpleDirectoryReader

指定 .pdf,自动按页读取带页码

标准文字型 PDF、手册、论文

LangChain

PyPDFLoader

自动分页 + 元数据带页码

常用 PDF 解析

Word DOCX

LlamaIndex

SimpleDirectoryReader

指定 .docx,一键读取

标准 Word 文档

LangChain

Docx2txtLoader

提取正文,保留段落结构

工作报告、文案类文档

CSV / Excel

LlamaIndex

SimpleDirectoryReader

指定 .csv/.xlsx,自动读取

简单表格、清单数据

LangChain

CSVLoader / UnstructuredExcelLoader

按行解析,字段清晰

业务数据表、导出报表

多格式混合

LlamaIndex

SimpleDirectoryReader

全自动识别,一行代码搞定

文件夹含多种格式文件

LangChain

多加载器组合

按后缀判断,灵活可控

自定义批量入库逻辑

五、一句话总结

本地文件读取核心是「格式适配+批量高效+元数据完整」,LlamaIndex 主打简洁全自动,LangChain 侧重灵活可扩展,可根据文件类型(单类型/多类型)和业务需求选择适配框架,完美支撑 RAG 知识库本地数据的高效入库。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐