使用SimpleDirectoryReader加载本地文件到LlamaIndex
在LlamaIndex中,SimpleDirectoryReader是加载本地文件数据的最简单方法。虽然对于生产用例,你可能更倾向于使用LlamaHub上提供的众多读取器之一,但SimpleDirectoryReader是入门的好方法。
支持的文件类型
默认情况下,SimpleDirectoryReader会尝试读取它找到的所有文件,并将它们都视为文本文件。除了纯文本,它还明确支持以下文件类型,这些类型是根据文件扩展名自动检测的:
.csv
- 逗号分隔值.docx
- Microsoft Word.epub
- EPUB电子书格式.hwp
- Hangul文字处理器.ipynb
- Jupyter Notebook.jpeg
,.jpg
- JPEG图像.mbox
- MBOX电子邮件存档.md
- Markdown.mp3
,.mp4
- 音频和视频.pdf
- 便携式文档格式.png
- 便携式网络图形.ppt
,.pptm
,.pptx
- Microsoft PowerPoint
你可能期望在这里找到JSON文件类型;对于JSON,我们推荐使用我们的JSON加载器。
使用方法
最基本的用法是传递一个input_dir
,它将加载该目录中的所有支持文件:
from llama_index.core import SimpleDirectoryReader
reader = SimpleDirectoryReader(input_dir="path/to/directory")
documents = reader.load_data()
如果从一个目录中加载许多文件,可以使用并行处理来加载文档。注意,在Windows和Linux/MacOS机器上使用多进程时存在差异,这在多进程文档中有解释。最终,Windows用户可能看不到性能提升,而Linux/MacOS用户在加载相同文件集时会看到这些提升。
documents = reader.load_data(num_workers=4)
从子目录读取
默认情况下,SimpleDirectoryReader只会读取目录顶层的文件。要从子目录读取文件,设置recursive=True
:
SimpleDirectoryReader(input_dir="path/to/directory", recursive=True)
迭代加载文件
你也可以使用iter_data()
方法来迭代和处理加载的文件:
reader = SimpleDirectoryReader(input_dir="path/to/directory", recursive=True)
all_docs = []
for docs in reader.iter_data():
# <对每个文件的文档进行处理>
all_docs.extend(docs)
限制加载的文件
你可以传递一个文件路径列表来加载特定文件:
SimpleDirectoryReader(input_files=["path/to/file1", "path/to/file2"])
或者使用exclude
传递一个要排除的文件路径列表:
SimpleDirectoryReader(
input_dir="path/to/directory", exclude=["path/to/file1", "path/to/file2"]
)
你还可以设置required_exts
来只加载具有特定扩展名的文件:
SimpleDirectoryReader(
input_dir="path/to/directory", required_exts=[".pdf", ".docx"]
)
并且可以使用num_files_limit
设置要加载的最大文件数:
SimpleDirectoryReader(input_dir="path/to/directory", num_files_limit=100)
指定文件编码
SimpleDirectoryReader期望文件是utf-8编码的,但你可以使用encoding
参数覆盖这一点:
SimpleDirectoryReader(input_dir="path/to/directory", encoding="latin-1")
提取元数据
你可以指定一个函数,该函数将读取每个文件并提取附加到每个文件的Document对象的元数据:
def get_meta(file_path):
return {"foo": "bar", "file_path": file_path}
SimpleDirectoryReader(input_dir="path/to/directory", file_metadata=get_meta)
该函数应接受一个参数(文件路径)并返回一个元数据字典。
扩展到其他文件类型
你可以通过传递一个文件扩展名到BaseReader实例的字典来扩展SimpleDirectoryReader以读取其他文件类型。BaseReader应读取文件并返回一个Document列表。例如,添加对.myfile
文件的自定义支持:
from llama_index.core import SimpleDirectoryReader
from llama_index.core.readers.base import BaseReader
from llama_index.core import Document
class MyFileReader(BaseReader):
def load_data(self, file, extra_info=None):
with open(file, "r") as f:
text = f.read()
return [Document(text=text + "Foobar", extra_info=extra_info or {})]
reader = SimpleDirectoryReader(
input_dir="./data", file_extractor={".myfile": MyFileReader()}
)
documents = reader.load_data()
print(documents)
注意,此映射将覆盖你指定的文件类型的默认文件提取器,因此如果你还想支持它们,需要将它们添加回来。
支持外部文件系统
与其他模块一样,SimpleDirectoryReader接受一个可选的fs
参数,可用于遍历远程文件系统。
这可以是fsspec协议实现的任何文件系统对象。fsspec协议有许多开源实现,包括AWS S3、Azure Blob & DataLake、Google Drive、SFTP等。
以下是一个连接到S3的示例:
from s3fs import S3FileSystem
s3_fs = S3FileSystem(key="...", secret="...")
bucket_name = "my-document-bucket"
reader = SimpleDirectoryReader(
input_dir=bucket_name,
fs=s3_fs,
recursive=True, # 递归搜索所有子目录
)
documents = reader.load_data()
print(documents)
完整的示例笔记本可以在这里找到。
通过这些方法,你可以轻松地将本地文件加载到LlamaIndex中,并根据需要进行自定义和扩展。