SimpleDirectoryReader
SimpleDirectoryReader 是将本地文件数据加载到LlamaIndex的最简单方式。对于生产环境用例,您更可能需要使用 LlamaHub 上提供的众多读取器之一,但 SimpleDirectoryReader 是入门的绝佳方式。
默认情况下,SimpleDirectoryReader 会尝试读取它找到的所有文件,将它们全部视为文本。除了纯文本之外,它还明确支持以下文件类型,这些类型会根据文件扩展名自动检测:
- .csv - 逗号分隔值
- .docx - Microsoft Word
- .epub - EPUB 电子书格式
- .hwp - 韩文文字处理器
- .ipynb - Jupyter 笔记本
- .jpeg, .jpg - JPEG 图像
- .mbox - MBOX 电子邮件归档
- .md - Markdown
- .mp3, .mp4 - 音频和视频
- .pdf - 便携式文档格式
- .png - 便携式网络图形
- .ppt, .pptm, .pptx - Microsoft PowerPoint
您可能期望在此找到的一种文件类型是 JSON;为此我们推荐您使用我们的 JSON 加载器。
最基本的用法是传入一个 input_dir,它将加载该目录下所有支持的文件:
from llama_index.core import SimpleDirectoryReader
reader = SimpleDirectoryReader(input_dir="path/to/directory")documents = reader.load_data()如果从目录加载多个文件,文档也可以通过并行处理方式加载。请注意,在Windows和Linux/MacOS机器上使用multiprocessing时存在差异,这些差异在multiprocessing文档中有详细说明(例如参见此处)。
最终,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(): # <do something with the documents per file> 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")SimpleDirectoryReader 会自动为每个 Document 对象附加一个 metadata 字典。默认情况下,该字典包含以下项目:
file_path: 文件的完整文件系统路径,包括文件名(字符串)file_name: 文件名,包含后缀(字符串)file_type: 文件的MIME类型,由`mimetypes.guess_type()推测得出(字符串)file_size: 文件大小,以字节为单位(整数)creation_date,last_modified_date,last_accessed_date: 文件的创建、修改和访问日期,已标准化为UTC时区。请参阅下方的日期与时间元数据(字符串)
但是,您可以替换用于创建元数据字典的逻辑。创建一个自定义函数,该函数接收文件路径字符串并返回字典,然后将此函数作为 SimpleDirectoryReader 传递给 file_metadata 构造函数:
def get_meta(file_path): return {"foo": "bar", "file_path": file_path}
reader = SimpleDirectoryReader( input_dir="path/to/directory", file_metadata=get_meta)
docs = reader.load_data()print(docs[0].metadata["foo"]) # prints "bar"SimpleDirectoryReader 中的默认元数据函数将日期输出为采用 格式 %Y-%m-%d 的字符串。
为确保一致性,时间戳已统一标准化为UTC时区。如果输出日期与实际日期相差一天,这可能是由于与UTC午夜时间偏移所致。
您可以通过将文件扩展名字典传递给 BaseReader 实例作为 file_extractor 来扩展 SimpleDirectoryReader 以读取其他文件类型。BaseReader 应读取文件并返回文档列表。例如,要为 .myfile 文件添加自定义支持:
from llama_index.core import SimpleDirectoryReaderfrom llama_index.core.readers.base import BaseReaderfrom 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() # load_data returns a list of Document objects 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, # recursively searches all subdirectories)
documents = reader.load_data()print(documents)完整示例笔记本可在此处找到。