Skip to content

S3

S3Reader #

Bases: BasePydanticReader, ResourcesReaderMixin, FileSystemReaderMixin

通用的S3文件或目录的通用读取器。

如果未设置key,则会解析整个存储桶(通过前缀进行过滤)。

Args: bucket(str):您的S3存储桶的名称 key(Optional[str]):特定文件的名称。如果未提供,则此加载器将遍历整个存储桶。 prefix(Optional[str]):在加载器遍历整个存储桶的情况下进行过滤的前缀。默认为空字符串。 recursive(bool):是否递归搜索子目录。默认为True。 file_extractor(Optional[Dict[str, BaseReader]]):文件扩展名到BaseReader类的映射,指定如何将该文件转换为文本。有关更多详细信息,请参见SimpleDirectoryReader。 required_exts(Optional[List[str]]):所需扩展名的列表。默认为None。 num_files_limit(Optional[int]):要读取的最大文件数。默认为None。 file_metadata(Optional[Callable[str, Dict]]):接受文件名并返回Document元数据字典的函数。默认为None。 aws_access_id(Optional[str]):直接提供AWS访问密钥。 aws_access_secret(Optional[str]):直接提供AWS访问密钥。 s3_endpoint_url(Optional[str]):直接提供S3端点URL。

Source code in llama_index/readers/s3/base.py
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
class S3Reader(BasePydanticReader, ResourcesReaderMixin, FileSystemReaderMixin):
    """通用的S3文件或目录的通用读取器。

如果未设置key,则会解析整个存储桶(通过前缀进行过滤)。

Args:
bucket(str):您的S3存储桶的名称
key(Optional[str]):特定文件的名称。如果未提供,则此加载器将遍历整个存储桶。
prefix(Optional[str]):在加载器遍历整个存储桶的情况下进行过滤的前缀。默认为空字符串。
recursive(bool):是否递归搜索子目录。默认为True。
file_extractor(Optional[Dict[str, BaseReader]]):文件扩展名到BaseReader类的映射,指定如何将该文件转换为文本。有关更多详细信息,请参见`SimpleDirectoryReader`。
required_exts(Optional[List[str]]):所需扩展名的列表。默认为None。
num_files_limit(Optional[int]):要读取的最大文件数。默认为None。
file_metadata(Optional[Callable[str, Dict]]):接受文件名并返回Document元数据字典的函数。默认为None。
aws_access_id(Optional[str]):直接提供AWS访问密钥。
aws_access_secret(Optional[str]):直接提供AWS访问密钥。
s3_endpoint_url(Optional[str]):直接提供S3端点URL。"""

    is_remote: bool = True

    bucket: str
    key: Optional[str] = None
    prefix: Optional[str] = ""
    recursive: bool = True
    file_extractor: Optional[Dict[str, Union[str, BaseReader]]] = Field(
        default=None, exclude=True
    )
    required_exts: Optional[List[str]] = None
    filename_as_id: bool = True
    num_files_limit: Optional[int] = None
    file_metadata: Optional[Callable[[str], Dict]] = Field(default=None, exclude=True)
    aws_access_id: Optional[str] = None
    aws_access_secret: Optional[str] = None
    aws_session_token: Optional[str] = None
    s3_endpoint_url: Optional[str] = None
    custom_reader_path: Optional[str] = None

    @classmethod
    def class_name(cls) -> str:
        return "S3Reader"

    def _get_s3fs(self):
        from s3fs import S3FileSystem

        return S3FileSystem(
            key=self.aws_access_id,
            endpoint_url=self.s3_endpoint_url,
            secret=self.aws_access_secret,
            token=self.aws_session_token,
        )

    def _get_simple_directory_reader(self) -> SimpleDirectoryReader:
        # we don't want to keep the reader as a field in the class to keep it serializable
        s3fs = self._get_s3fs()

        input_dir = self.bucket
        input_files = None

        if self.key:
            input_files = [f"{self.bucket}/{self.key}"]
        elif self.prefix:
            input_dir = f"{input_dir}/{self.prefix}"

        return SimpleDirectoryReader(
            input_dir=input_dir,
            input_files=input_files,
            file_extractor=self.file_extractor,
            required_exts=self.required_exts,
            filename_as_id=self.filename_as_id,
            num_files_limit=self.num_files_limit,
            file_metadata=self.file_metadata,
            recursive=self.recursive,
            fs=s3fs,
        )

    def load_s3_files_as_docs(self, temp_dir=None) -> List[Document]:
        """从S3加载文件。"""
        loader = self._get_simple_directory_reader()
        return loader.load_data()

    def _adjust_documents(self, documents: List[Document]) -> List[Document]:
        for doc in documents:
            if self.s3_endpoint_url:
                doc.id_ = self.s3_endpoint_url + "_" + doc.id_
            else:
                doc.id_ = "s3_" + doc.id_
        return documents

    def load_data(self, custom_temp_subdir: str = None) -> List[Document]:
        """从S3加载文件(们)。

Args:
    custom_temp_subdir(str,可选):此参数已弃用且未使用。默认为None。

Returns:
    List[Document]:从S3加载的文档列表。
"""
        if custom_temp_subdir is not None:
            warnings.warn(
                "The `custom_temp_subdir` parameter is deprecated and unused. Please remove it from your code.",
                DeprecationWarning,
            )

        documents = self.load_s3_files_as_docs()
        return self._adjust_documents(documents)

    def list_resources(self, **kwargs) -> List[str]:
        simple_directory_reader = self._get_simple_directory_reader()
        return simple_directory_reader.list_resources(**kwargs)

    def get_resource_info(self, resource_id: str, **kwargs) -> Dict:
        # can't use SimpleDirectoryReader.get_resource_info because it lacks some fields
        fs = self._get_s3fs()
        info_result = fs.info(resource_id)

        last_modified_date = info_result.get("LastModified")
        if last_modified_date and isinstance(last_modified_date, datetime):
            last_modified_date = last_modified_date.astimezone(timezone.utc).strftime(
                "%Y-%m-%dT%H:%M:%SZ"
            )
        else:
            last_modified_date = None

        info_dict = {
            "file_path": str(resource_id),
            "file_size": info_result.get("size"),
            "last_modified_date": last_modified_date,
            "content_hash": info_result.get("ETag"),
        }

        # Ignore None values
        return {
            meta_key: meta_value
            for meta_key, meta_value in info_dict.items()
            if meta_value is not None
        }

    def load_resource(self, resource_id: str, **kwargs) -> List[Document]:
        simple_directory_reader = self._get_simple_directory_reader()
        docs = simple_directory_reader.load_resource(resource_id, **kwargs)
        return self._adjust_documents(docs)

    def read_file_content(self, input_file: Path, **kwargs) -> bytes:
        simple_directory_reader = self._get_simple_directory_reader()
        return simple_directory_reader.read_file_content(input_file, **kwargs)

load_s3_files_as_docs #

load_s3_files_as_docs(temp_dir=None) -> List[Document]

从S3加载文件。

Source code in llama_index/readers/s3/base.py
 98
 99
100
101
def load_s3_files_as_docs(self, temp_dir=None) -> List[Document]:
    """从S3加载文件。"""
    loader = self._get_simple_directory_reader()
    return loader.load_data()

load_data #

load_data(custom_temp_subdir: str = None) -> List[Document]

从S3加载文件(们)。

Returns:

Type Description
List[Document]

List[Document]:从S3加载的文档列表。

Source code in llama_index/readers/s3/base.py
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
    def load_data(self, custom_temp_subdir: str = None) -> List[Document]:
        """从S3加载文件(们)。

Args:
    custom_temp_subdir(str,可选):此参数已弃用且未使用。默认为None。

Returns:
    List[Document]:从S3加载的文档列表。
"""
        if custom_temp_subdir is not None:
            warnings.warn(
                "The `custom_temp_subdir` parameter is deprecated and unused. Please remove it from your code.",
                DeprecationWarning,
            )

        documents = self.load_s3_files_as_docs()
        return self._adjust_documents(documents)