AI开发-python-langchain框架(3-2-文本文档加载器 )

上节讲如何将文本进行向量化,本节讲讲如何将文本文件加载到程序中,进行下一步处理,langchain 的 TextLoader提供了这个功能。

langchain 的 TextLoader 并非支持所有文本格式,它的核心作用是读取「纯文本类文件」,对非纯文本格式(如带格式的文档、二进制文件)无法直接解析,需搭配对应专用 Loader。

一、TextLoader 支持的主要文本类型(可直接读取)

  1. 纯文本文件:.txt(最常用,无任何格式,直接读取文本内容);
  2. 简单标记 / 配置文件:.md(Markdown,仅读取文本内容,忽略格式标记)、.json(读取完整文本字符串,不解析 JSON 结构)、.yaml/.yml(同 JSON,仅读取文本,不解析配置);
  3. 代码文件:.py(Python 代码)、.java.js 等,读取代码文本内容(不执行、不解析代码逻辑);
  4. 其他纯文本类文件:.csv(读取为纯文本,不解析表格结构)、.log(日志文件,纯文本形式直接读取)。

二、TextLoader 不支持的文本格式(需专用 Loader)

以下格式无法用 TextLoader 直接读取,需使用 langchain 对应专用 Loader(如 UnstructuredLoader、PyPDFLoader 等):

  • 带格式文档:.docx(Word)、.pptx(PPT)、.xlsx(Excel);
  • PDF 文件:.pdf(需用 PyPDFLoader、PDFMinerLoader 等);
  • 二进制文件:.png(图片)、.mp3(音频)、.mp4(视频);
  • 加密 / 压缩文件:.zip.rar、加密文档等。

三、关键补充

TextLoader 的核心逻辑是「按字符读取文件内容」,无论文件后缀是什么,只要是纯文本编码(UTF-8、GBK 等) 的文件,都能读取;但如果文件包含非文本编码(如二进制、特殊格式标记),读取后会出现乱码,失去实际意义。
简单总结:TextLoader 只适用于「无复杂格式的纯文本类文件」,复杂格式需搭配对应专用 Loader。
代码部分:

复制代码
# pip install unstructured  # 安装unstructured库,用于处理非结构化文档

from langchain_community.document_loaders import TextLoader, DirectoryLoader, JSONLoader
import os

# ==================== 获取当前文件路径 ====================
# os.path.abspath(__file__) 获取当前脚本的绝对路径
# os.path.dirname() 获取路径的目录部分
current_dir = os.path.dirname(os.path.abspath(__file__))
print('---------当前路径')
print(current_dir)  # 打印当前脚本所在的目录路径

# ==================== 加载单个TXT文件 ====================
print('---------txt文件加载')
# TextLoader: 用于加载文本文件的加载器
# "./txt/1.txt": 相对路径下的txt文件
# encoding="utf8": 指定文件编码为UTF-8,防止中文乱码
loader = TextLoader("./txt/1.txt", encoding="utf8")
doc = loader.load()  # load()方法执行实际的文件读取操作
print(doc)  # 打印加载的文档内容

# ==================== 加载单个HTML文件 ====================
print('---------html文件加载')
# 虽然文件是HTML格式,但TextLoader会将其作为纯文本读取
loader1 = TextLoader("./txt/Color-management.html", encoding="utf8")
doc1 = loader1.load()
print(doc1)

# ==================== 目录加载器 ====================
# Windows系统需要先安装: pip install python-magic-bin
# Linux系统需要先安装: pip install python-magic
print('---------目录加载器 一个目录下所有文件加载')
# DirectoryLoader: 用于加载整个目录下的所有文件
# './file': 指定要加载的目录路径
# 默认会加载目录下的所有文件(包括子目录)
loader = DirectoryLoader('./file')
texts = loader.load()  # 加载目录中的所有文件
print(texts)  # 打印所有加载的文档

# ==================== 使用glob参数筛选特定文件 ====================
print('---------我们可以使用 glob 参数来控制加载哪些文件。请注意,此处它只加载.json 文件。')
# DirectoryLoader 的高级用法:
# glob="**/*.json": 使用glob模式匹配所有.json文件
#   ** 表示任意层级的子目录
#   *.json 表示所有以.json结尾的文件
# loader_cls=TextLoader: 指定使用TextLoader来加载匹配到的文件
# loader_kwargs={'encoding': 'gbk'}: 传递给TextLoader的参数,指定使用GBK编码
#   因为有些JSON文件可能使用GBK编码(常见于中文Windows系统)
loader = DirectoryLoader(
    './txt',  # 要扫描的根目录
    glob="**/*.json",  # 只加载JSON文件
    loader_cls=TextLoader,  # 使用文本加载器
    loader_kwargs={'encoding': 'gbk'}  # 指定编码为GBK
)
josntxt = loader.load()  # 加载所有匹配的JSON文件
print(josntxt)  # 打印加载的JSON文件内容

执行结果:

D:\ProgramData\Anaconda3\envs\llm\python.exe D:/pythonProject2025/LLmProject/3/2-文本文档加载器.py

---------当前路径

D:\pythonProject2025\LLmProject\3

---------txt文件加载

Document(page_content=' 文本切割是自然语言处理中的基础操作,主要用于将较长的文本内容拆解为更小的、可处理的单...... ---------html文件加载 \[Document(page_content='\\\n\\\n\\n\\\n\\t\\\n\\t\