跳转到主要内容

为PyFilesystem2提供的Amazon S3文件系统

项目描述

miarec_s3fs

Actions

MiaRec S3FS是PyFilesystem接口,用于Amazon S3云存储。

作为PyFilesystem的具体类,S3FS允许您以与其他支持的文件系统相同的方式与S3进行交互。

这是fs-s3fs项目的分支,由Will McGugan编写(邮箱willmcgugan@gmail.com)。

MiaRec团队修改了代码以满足需求。

miarec_s3fs与fs-s3fs之间的显著差异

  1. 需要Python 3.6+。已移除对Python 2.7的支持。

  2. 未实现打开器。请使用显式构造函数。

  3. 使用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_argsdownload_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

文档

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

miarec_s3fs-2024.1.1.tar.gz (15.9 kB 查看哈希值)

上传于

构建分发版

miarec_s3fs-2024.1.1-py2.py3-none-any.whl (12.7 kB 查看哈希值)

上传于 Python 2 Python 3

由以下支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误记录 StatusPageStatusPage 状态页面