RAG文档读取范式之一——本地文件读取
一、核心定义、支持文件与适用场景
- 定义:从本地磁盘读取各种格式文件,自动统一提取文本内容与元数据(如文件路径、名称、大小、修改时间等),适配 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 |
单个加载 + 目录批量,支持多线程 |
简单文本批量入库 |
|
|
|
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 知识库本地数据的高效入库。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)