s3fs:用操作本地文件的方式读写 S3
s3fs 在 GitHub 上已经拿到 1,033 Star 了。
这个项目属于 fsspec 生态,专门做一件事:给 Amazon S3 提供一个 Python 文件系统接口。基于 aiobotocore 实现,让你用 open、read、write 这些熟悉的方法直接操作 S3 上的对象,不需要关心底层的 HTTP 请求和分页逻辑。
1、这玩意儿是干嘛的
一句话:把 S3 对象存储包装成你熟悉的文件系统。
在 Python 里读写 S3 文件,通常要走 boto3 或 aiobotocore。这意味着你要先创建客户端、配置 region、处理各种异常、手动管理流。代码写出来差不多是这样:
import boto3
s3 = boto3.client('s3')
response = s3.get_object(Bucket='my-bucket', Key='my-file.txt')
content = response['Body'].read()
s3fs 把这些都包了一层。上面的代码变成:
import s3fs
fs = s3fs.S3FileSystem()
with fs.open('my-bucket/my-file.txt', 'r') as f:
content = f.read()
目录操作也一样:
fs.ls('my-bucket')
fs.mkdir('my-bucket/new-folder')
fs.rm('my-bucket/old-file.txt')
2、为什么要用它
做过数据管线的人都清楚,S3 交互代码很容易变成一坨模板代码。配置客户端、处理分页、管理流式读写、重试逻辑……每次新项目都要复制粘贴一遍,测试还要 mock S3 服务。
s3fs 把这些重复工作都收进去了。更重要的是,它是 fsspec 的标准实现之一。fsspec 是 Python 里文件系统规范的统一抽象,pandas、xarray、dask 这些主流工具都认它。你的代码里写 s3://my-bucket/data.csv,pandas 底层自动调度 s3fs 来读。
异步场景它也能覆盖。基于 aiobotocore,所有操作都支持异步接口。并发读写大量小文件时,不会因为同步等待而卡死。
3、核心能力
- 完整的文件系统操作:open、read、write、append、copy、move、rm、mkdir、ls、info
- 流式读写:大文件不需要全部加载到内存,边读边处理
- 目录缓存:重复列目录时减少 API 调用,降低成本
- 异步支持:基于 aiobotocore 的 async 接口,适合高并发场景
- 与 fsspec 生态集成:pandas、dask、xarray 开箱即用
- 兼容多种 S3 端点:AWS、MinIO、Ceph、阿里云 OSS 等
4、安装和配置
安装很简单:
pip install s3fs
基本用法:
import s3fs
fs = s3fs.S3FileSystem()
with fs.open('my-bucket/data.txt', 'w') as f:
f.write('Hello, S3!')
with fs.open('my-bucket/data.txt', 'r') as f:
print(f.read())
指定自定义端点:
fs = s3fs.S3FileSystem(
endpoint_url='https://play.minio.io:9000',
key='minio',
secret='minio123'
)
5、适合哪些人用
- 需要在 Python 里频繁读写 S3 的数据工程师
- 用 pandas、dask 处理云端数据的分析师
- 搭数据管线、不想重复写 S3 模板代码的开发者
- 用 MinIO 或兼容 S3 的私有存储的团队
6、写在最后
s3fs 的思路很直接:用统一的文件系统抽象覆盖各种存储后端。S3 是对象存储,但很多时候你只想把它当文件系统来用。这个项目就是干这个的,没有多余的东西,代码量也不大,但正好填平了那层 gap。一千多 Star 不算多,但在 fsspec 生态里它是一个基础组件,很多你日常在用的工具底层都依赖它。