# File System
This is the File System Module, designed to handle file transfer functionalities.
## Overview
The component currently supports three types of IO Handler:
1. scepter.modules.utils.file_clients.AliyunOssFs
2. scepter.modules.utils.file_clients.LocalFs
3. scepter.modules.utils.file_clients.HttpFs
## Basic Usage
```python
from scepter.modules.utils.file_system import FS
from scepter.modules.utils.config import Config
fs_cfg = Config(load=False, cfg_dict={
"NAME": "AliyunOssFs",
# ENDPOINT DESCRIPTION: the oss endpoint TYPE: str default: ''
"ENDPOINT": "xxxxx",
# BUCKET DESCRIPTION: the oss bucket TYPE: str default: ''
"BUCKET": "xxxxx",
# OSS_AK DESCRIPTION: the oss ak TYPE: str default: ''
"OSS_AK": "xxxxx",
# OSS_SK DESCRIPTION: the oss sk TYPE: str default: ''
"OSS_SK": "xxxxx",
# TEMP_DIR DESCRIPTION: default is None, means using system cache dir and auto remove! If you set dir, the data will be saved in this temp dir without autoremoving default. TYPE: NoneType default: None
"TEMP_DIR": "cache",
# AUTO_CLEAN DESCRIPTION: when TEMP_DIR is not None, if you set AUTO_CLEAN to True, the data will be clean automatics. TYPE: bool default: False
"AUTO_CLEAN": False
})
fs_prefix = FS.init_fs_client(fs_cfg, logger=None)
with FS.get_from("xxxxx", wait_finish=True) as local_object:
# do sth. using local_object here.
# Download multiple files at once.
generator = FS.get_batch_objects_from(["xxx", "xxxx"])
for local_path in generator:
print(local_path)
```
## **scepter.modules.utils.file_system.FileSystem**
By building various File IO Handlers, it supports read and write operations for different types of files.
### function **\_\_init\_\_**
()
**Parameters**
### function **init_fs_client**
( cfg: *scepter.modules.utils.config.Config* = None, logger = None ) -> str
The fs_client is instantiated through the cfg parameter and stored in the self._prefix_to_clients attribute, allowing access to the corresponding fs_client via the prefix.
**Parameters**
- **cfg** —— The Config used to build fs_client. If None, use LocalFs as default.
- **logger** —— Instantiated Logger to print or save log.
**Returns**
- *str* —— The prefix of instantiated fs_client
### function **get_fs_client**
( target_path: *str*, safe: *bool* = False )
Retrieve the corresponding fs_client based on the prefix of the target_path.
**Parameters**
- **target_path** —— Target file path.
- **safe** —— In safe mode, return a copy of the client; otherwise, return the client itself.
**Returns**
- *BaseFs* —— Instantiated fs_client.
### function **get_from**
( target_path: *str*, local_path: *str* = None, wait_finish: *bool* = False ) -> str
Download remote files to the local system.
**Parameters**
- **target_path** —— Remote file path.
- **local_path** —— Local file path; if None, use the cache path.
- **wait_finish** —— if True, only the card 0 of each machine will download the data, and the other cards will wait for the download by card 0 to finish.
**Returns**
- *str* —— Local save file path.
### function **get_dir_to_local_dir**
( target_path: *str*, local_path: *str* = None, wait_finish: *bool* = False, timeout: *int* = 3600, worker_id: *int* = 0 ) -> str
Download a folder from a remote path to the local system.
**Parameters**
- **target_path** —— Remote folder path.
- **local_path** —— Local folder path; if None, use the cache path.
- **wait_finish** —— if True,only the 0-card of each machine downloads the data, while the other cards wait for the 0-card to finish downloading.
- **timeout** —— Download timeout duration.
- **worker_id** —— Deprecated
**Returns**
- *str* —— 本地文件夹路径
### function **get_object**
(target_path: *str*) -> bytes
Read a remote file into memory
**Parameters**
- **target_path** — Target file path
**Returns**
- *bytes* — Binary data of the target file
### function **put_object**
(local_data: *bytes*, target_path: *str*) -> bool
Upload a data stream to a specified file
**Parameters**
- **local_data** — Local data stream
- **target_path** — Target file path
**Returns**
- *bool* — Whether the upload was successful
### function **delete_object**
(target_path: *str*) -> bool
Delete the target file
**Parameters**
- **target_path** — Target file path
**Returns**
- *bool* — Whether the deletion was successful
### function **get_batch_objects_from**
(target_path_list: *list[str]*, wait_finish: *bool*) -> Iterator[str]
Batch download files
**Parameters**
- **target_path_list** — List of files to download
**Returns**
- *Iterator[str]* — Iterator for local file paths
-
### function **put_batch_objects_to**
(local_path_list: *list[str]*, target_path_list: *list[str]*, wait_finish: *bool*) -> Iterator[tuple[str, str]]
Batch upload files
**Parameters**
- **local_path_list** — List of files to upload
- **target_path_list** — List of target file paths
**Returns**
- *Iterator[tuple[str, str]]* — Returns pairs of local file and target file paths
### function **get_object_stream**
(target_path: *str*, start: *int*, size: *int*, delimiter: *str*) -> bytes, int
Batch upload files
**Parameters**
- **target_path** — Target file
- **start** — Starting character position of the target stream
- **size** — Size of the target stream starting from the character position
- **delimiter** — Delimiter character for the end of the target stream
**Returns**
- *bytes, int* — Returns the data stream bytes and the end character position
### function **get_object_chunk_list**
(target_path: *str*, chunk_num: *int* = 1, delimiter: *str* = None) -> list[bytes]
Get a remote file and divide it into chunks
**Parameters**
- **target_path** — Target file path
-**chunk_num** — Number of chunks
- **delimiter** — Delimiter to ensure the data downloaded is a complete record and not truncated in the middle
**Returns**
- *list[bytes]* — Chunked data
### function **get_url**
(target_path: *str*, set_public=False, lifecycle: *int* = 360000) -> str
Get the URL of a remote file (only supports AliyunOssFs)
**Parameters**
- **target_path** — Target file path
- **lifecycle** — Valid duration
- **set_public** — Whether to provide a public link
**Returns**
- *str* — URL of the target file
### function **put_to**
(target_path: *str*)
Supports uploading a local file to a remote path
**Parameters**
- **target_path** — Remote file path
**Returns**
- **None**
```python
# Used as a context manager
with FS.put_to(target_path) as local_path:
# some operations on local_path.
```
### function **put_object_from_local_file**
(local_path: *str*, target_path: *str*) -> bool
Push a local file to a remote path
**Parameters**
- **local_path** — Local file path
- **target_path** — Remote file path
**Returns**
- *bool* — Whether the upload was successful
### function **put_dir_from_local_dir**
(local_dir: *str*, target_dir: *str*) -> bool
Push a local directory to a remote path
**Parameters**
- **local_dir** — Local directory path
- **target_dir** — Remote directory path
**Returns**
- *bool* — Whether the upload was successful
### function **add_target_local_map**
(target_dir: *str*, local_dir: *str*) -> None
Save the mapping relationship between the remote directory path and the local directory path as key-value pairs to self._target_local_mapper
**Parameters**
- **target_dir** — Remote directory path
- **local_dir** — Local directory path
**Returns**
- *None*
### function **make_dir**
(target_dir: *str*) -> bool
Create a remote directory
**Parameters**
- **target_dir** — Remote directory path
**Returns**
- *bool* — Whether the creation was successful
### function **exists**
(target_path: *str*) -> bool
Check if the target path exists
**Parameters**
- **target_path** — Remote file path
**Returns**
- *bool* — Whether it exists
### function **map_to_local**
(target_path: *str*) -> str, bool
Map the remote file path to a local path
**Parameters**
- **target_path** — Remote file path
**Returns**
- *str* — Local file path
- *bool* — Whether the local file is a temporary file
### function **walk_dir**
(target_dir: *str*, recurse=True) -> Iterator
Get the file list under the remote directory
**Parameters**
- **target_dir** — Remote directory path
- **recurse** — Whether to traverse subdirectories, default is True
**Returns**
- *Iterator* — List of subfile paths
### function **is_local_client**
(target_path: *str*) -> bool
Determine if the target file client is LocalFs
**Parameters**
- **target_path** — Target file path
**Returns**
- *bool* — Whether the client is LocalFs
### function **size**
(target_path: *str*) -> int
Determine the size of the target file
**Parameters**
- **target_path** — Target file path
**Returns**
- *int* — Size of the target file
### function **isfile**
(target_path: *str*) -> bool
Determine if the target path is an object
**Parameters**
- **target_path** — Target file path
**Returns**
- *bool* — Whether the target path is an object
### function **isdir**
(target_path: *str*) -> bool
Determine if the target path is a directory
**Parameters**
- **target_path** — Target file path
**Returns**
- *bool* — Whether the target path is a directory
## **scepter.modules.utils.file_clients.AliyunOssFs**
```yaml
NAME: AliyunOssFs
TEMP_DIR: None
AUTO_CLEAN: False
ENDPOINT:
BUCKET:
OSS_AK:
OSS_SK:
PREFIX: ""
WRITABLE: True
CHECK_WRITABLE: False
RETRY_TIMES: 10
```
## **scepter.modules.utils.file_clients.LocalFs**
```yaml
NAME: LocalFs
TEMP_DIR: None
AUTO_CLEAN: False
```
## **scepter.modules.utils.file_clients.HttpFs**
```yaml
NAME: HttpFs
TEMP_DIR: None
AUTO_CLEAN: False
RETRY_TIMES: 10
```