为PyFilesystem2提供的Amazon S3文件系统
项目描述
miarec_s3fs
MiaRec S3FS是PyFilesystem接口,用于Amazon S3云存储。
作为PyFilesystem的具体类,S3FS允许您以与其他支持的文件系统相同的方式与S3进行交互。
这是fs-s3fs项目的分支,由Will McGugan编写(邮箱willmcgugan@gmail.com)。
MiaRec团队修改了代码以满足需求。
miarec_s3fs与fs-s3fs之间的显著差异
-
需要Python 3.6+。已移除对Python 2.7的支持。
-
未实现打开器。请使用显式构造函数。
-
使用moto运行单元测试
安装
您可以通过以下方式从pip安装S3FS
pip install miarec_s3fs
这将安装最新稳定版本。
或者,如果您想使用最新代码,您可以在https://github.com/miarec/miarec_s3fs查看GitHub仓库
打开S3FS
通过显式使用构造函数打开S3FS
from fs_s3fs import S3FS
s3fs = S3FS('mybucket')
限制
严格来说,Amazon S3 并不是一个 文件系统,尽管它包含文件,但并不提供真正的 目录。S3FS 通过创建以斜杠结尾的对象来模拟目录。例如,如果您创建一个名为 "foo/bar"
的文件,S3FS 将为文件创建一个名为 "foo/bar"
的 S3 对象 以及 一个名为 "foo/"
的空对象,该对象存储着 "foo"
目录存在的事实。
如果您使用 S3FS 创建所有文件和目录,那么您无需关心底层存储方式。一切都将如您所期望的那样工作。如果您的数据没有使用 S3FS 上传,您可能会遇到问题。例如,如果您创建了一个没有 "foo/"
对象的 "foo/bar"
对象。如果发生这种情况,S3FS 可能会报告不存在目录的错误,而您期望它们存在。解决方案是为所有目录和子目录创建一个空对象。幸运的是,大多数工具都会为您做这件事,并且可能只需要手动上传文件。
身份验证
如果您不提供任何凭证,那么 S3FS 将使用您系统上配置的访问密钥和秘密密钥。
以下是使用构造函数指定凭证的方法
s3fs = S3FS(
'mybucket'
aws_access_key_id=<access key>,
aws_secret_access_key=<secret key>
)
注意:Amazon 建议不要在生产环境中明确指定凭证。
下载文件
要从 S3 存储桶中下载文件,请打开 S3 文件系统的文件以进行读取,然后将数据写入本地文件系统中的文件。以下是一个将文件 example.mov
从 S3 复制到您的硬盘的示例
from fs.tools import copy_file_data
with s3fs.open('example.mov', 'rb') as remote_file:
with open('example.mov', 'wb') as local_file:
copy_file_data(remote_file, local_file)
虽然更倾向于使用 fs.copy
模块中的高级功能。以下是一个示例
from fs.copy import copy_file
copy_file(s3fs, 'example.mov', './', 'example.mov')
上传文件
您可以以相同的方式上传文件。只需将文件从源文件系统复制到 S3 文件系统。有关更多信息,请参阅移动和复制。
ExtraArgs
S3 对象具有超出传统文件系统的额外属性。这些选项可以使用 upload_args
和 download_args
属性设置,这些属性在文件系统实例的生命周期内传递给上传和下载方法。
例如,要设置上传到存储桶的所有对象的 cache-control
头部
import fs, fs.mirror
s3fs = S3FS('example', upload_args={"CacheControl": "max-age=2592000", "ACL": "public-read"})
fs.mirror.mirror('/path/to/mirror', s3fs)
有关更多信息,请参阅Boto3 文档。
S3 信息
您可以通过 s3
命名空间检索 S3 信息。以下是一个示例
>>> info = s.getinfo('foo', namespaces=['s3'])
>>> info.raw['s3']
{'metadata': {}, 'delete_marker': None, 'version_id': None, 'parts_count': None, 'accept_ranges': 'bytes', 'last_modified': 1501935315, 'content_length': 3, 'content_encoding': None, 'request_charged': None, 'replication_status': None, 'server_side_encryption': None, 'expires': None, 'restore': None, 'content_type': 'binary/octet-stream', 'sse_customer_key_md5': None, 'content_disposition': None, 'storage_class': None, 'expiration': None, 'missing_meta': None, 'content_language': None, 'ssekms_key_id': None, 'sse_customer_algorithm': None, 'e_tag': '"37b51d194a7513e45b56f6524f2d51f2"', 'website_redirect_location': None, 'cache_control': None}
S3 URL
您可以使用 geturl
方法从 S3 对象生成一个外部可访问的 URL。以下是一个示例
>>> s3fs.geturl('foo')
'https://fsexample.s3.amazonaws.com//foo?AWSAccessKeyId=AKIAIEZZDQU72WQP3JUA&Expires=1501939084&Signature=4rfDuqVgmvILjtTeYOJvyIXRMvs%3D'
测试
自动单元测试在 GitHub Actions 上运行
要本地运行测试,请执行以下操作。
在本地机器上安装 Docker。
创建并激活 Python 虚拟环境
python -m vevn venv
source venv\bin\activate
安装项目和测试依赖项
pip install -e ".[test]"
运行测试
pytest