23. LangChain组件——Document loaders:文档加载器
1. 什么是文档加载器,有什么用?文档加载器提供了一套标准接口,用于将不同来源(如CSV、PDF 或JSON等)的数据读取为LangChain的文档格式。
这确保了无论数据来源如何,都能对其进行一致性处理。
注:
[*]文档加载器均继承于BaseLoader类
[*]返回Document类型的对象
2. 常见的文件类型加载实战
①CSV Loader
# 方式1: 一次性批量加载
from langchain_community.document_loaders import CSVLoader
loader = CSVLoader(
file_path="E:/data/stu.csv", # 按实际情况修改文件地址
csv_args={
"delimiter": ",", # 指定分隔符
"quotechar": '"', # 指定带有分隔符文本的引号包围是单引号还是双引号
# 如果数据原本有表头,就不要下面的代码,如果没有可以使用
"fieldnames": ['name', 'age', 'gender', '爱好']
},
encoding="utf-8" # 指定编码为UTF-8
)
# 批量加载 .load() ->
documents = loader.load()
#print(documents)
for document in documents:
print(type(document), document)
# 方式2: 懒加载,延迟流式传输文档,对大型数据集很有用,避免内存溢出。
from langchain_community.document_loaders import CSVLoader
loader = CSVLoader(
file_path="E:/P3_LangChainRAG开发/data/stu.csv", #按实际情况修改文件地址
csv_args={
"delimiter": ",", # 指定分隔符
"quotechar": '"', # 指定带有分隔符文本的引号包围是单引号还是双引号
# 如果数据原本有表头,就不要下面的代码,如果没有可以使用
"fieldnames": ['name', 'age', 'gender', '爱好']
},
encoding="utf-8" # 指定编码为UTF-8
)
#懒加载 .lazy_load() 迭代器
for document in loader.lazy_load():
print(document)
②Json Loader
from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
file_path="E:/data/stu_json_lines.json",
jq_schema=".name",
text_content=False, # 告知JSONLoader 我抽取的内容不是字符串
json_lines=True # 告知JSONLoader 这是一个JSONLines文件(每一行都是一个独立的标准JSON)
)
document = loader.load()
print(document)
③text Loader
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
# pip install langchain_text_splitters
loader = TextLoader("E:/data/Python基础语法.txt", encoding="utf-8")
docs = loader.load() #
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 分段的最大字符数
chunk_overlap=50, # 分段之间允许重叠字符数
# 文本自然段落分隔的依据符号
separators=["\n\n", "\n", "。", "!", "?", ".", "!", "?", " ", ""],
length_function=len, # 统计字符的依据函数
)
split_docs = splitter.split_documents(docs)
print(len(split_docs))
for doc in split_docs:
print("="*20)
print(doc)
print("="*20)
④PyPDFLoader
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(
file_path="E:/data/pdf2.pdf",
#mode="single", # 默认是page模式,每个页面形成一个Document文档对象,
# single模式,不管有多少页,只返回1个Document对象
password="itheima"
)
i = 0
for doc in loader.lazy_load():
i += 1
print(doc)
print("="*20, i)
什么是文档加载器?
简单来说,文档加载器就是把各种格式的文件(比如CSV、PDF、TXT)里的内容,“加载”成LangChain能看懂的统一格式(Document 对象)。这样不管你原来的数据是表格还是文章,LangChain都能用同样的方法来处理它们。
核心作用: 统一数据入口,方便后续处理(如文本分割、向量化等)。
注意:
[*]所有的文档加载器都基于 BaseLoader 类。
[*]它们最终都会返回一个或多个 Document 对象。
常见文件加载实战
① CSV 文件加载
有两种加载模式:
[*]批量加载 (.load()): 一次性把整个文件读入内存。
[*]懒加载 (.lazy_load()): 按需一行行读取,对于大文件可以节省内存,避免程序崩溃。
from langchain_community.document_loaders import CSVLoader
# 方式1: 一次性批量加载
loader = CSVLoader(
file_path="E:/data/stu.csv", # 你的文件路径
csv_args={
"delimiter": ",", # 指定分隔符为逗号
"quotechar": '"', # 指定文本引号
},
encoding="utf-8"
)
documents = loader.load() # 一次性全部加载
for doc in documents:
print(doc)
print("-" * 40)
# 方式2: 懒加载(迭代器)
loader2 = CSVLoader(file_path="E:/data/stu.csv", encoding="utf-8")
for doc in loader2.lazy_load(): # 用for循环迭代,一次返回一个文档
print(doc)
② JSON 文件加载
使用 jq_schema 参数来指定你想提取JSON中的哪个部分。
from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
file_path="E:/data/stu_json_lines.json",
jq_schema=".name", # 提取每个JSON对象里的"name"字段
text_content=False, # 告诉加载器,提取的内容不是纯文本字符串(这里提取的是字段值)
json_lines=True # 告知这是JSON Lines格式(每行一个独立JSON)
)
documents = loader.load()
print(documents)
③ 文本 (TXT) 文件加载与分割
文本文件加载后,通常需要分割成小块,以便AI模型处理。
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 加载文本
loader = TextLoader("E:/data/Python基础语法.txt", encoding="utf-8")
docs = loader.load() # 得到一个Document列表
# 创建文本分割器
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每个文本块的最大长度
chunk_overlap=50, # 块与块之间重叠的字符数(保持上下文连贯)
length_function=len, # 计算文本长度的函数
)
# 执行分割
split_docs = splitter.split_documents(docs)
print(f"原始文档数:{len(docs)}, 分割后块数:{len(split_docs)}")
for doc in split_docs:
print("="*20)
print(doc.page_content) # 打印分割后的文本内容
print("="*20)
④ PDF 文件加载
可以按页加载,也可以将整个PDF作为一个文档加载。
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(
file_path="E:/data/pdf2.pdf",
# mode="single", # 默认是'page',每页一个Document。设为'single'则整个PDF为一个Document。
password="itheima" # 如果PDF有密码,在这里填写
)
# 使用懒加载按页读取
i = 0
for doc in loader.lazy_load():
i += 1
print(f"第 {i} 页内容:")
print(doc.page_content[:100]) # 打印每页的前100个字符作为预览
print("="*20)
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]