简介
fsspec(Filesystem Spec)是一个 Python 库,它提供了一个统一的接口来访问各种文件系统和存储后端,无论它们是本地文件、网络存储还是云存储服务。它的核心思想是抽象出文件系统的通用操作,让用户可以用一致的方式处理不同类型的文件存储。
fsspec 提供了两个主要概念:
- 一组具有统一 API 的文件系统类(即诸如 cp、rm、cat、mkdir 等函数),用于在一系列存储系统上提供操作;
- 以及像 fsspec.open() 这样的顶级便捷函数,使你能够快速从 URL 获得一个类似文件的对象,以便与第三方库或你自己的代码一起使用。
核心功能与特点
- 统一接口:为各种文件系统提供相同的方法(如open()、ls()、mkdir()等),无需关心底层存储类型。
- 支持多种存储后端:
- 本地文件系统
- 网络存储(HTTP、FTP)
- 云存储(AWS S3、Google Cloud Storage、Azure Blob Storage)
- 分布式文件系统(HDFS)
- 其他特殊文件系统(如内存文件系统、Zip 文件等)
- 延迟加载:只在需要时才加载特定存储系统的依赖库,避免不必要的依赖。
- 可扩展性:允许用户通过插件方式添加自定义文件系统。
使用fsspec 的库
以下库在内部使用 fsspec 进行路径和文件处理:
- dask: 并行、核外及分布式编程平台
- intake: 数据源编目与加载库及其插件
- pandas: 表格数据分析包
- xarray: 多维数组存储和带标签的操作
- zarr
- DVC: 机器学习项目的版本控制系统
- kedro: 一个用于可复现、可维护且模块化的数据科学代码的Python框架
- pyxet: 一个用于从XetHub挂载和访问超大型数据集的Python库
- huggingface datasets: 用于深度学习模型的数据加载和处理的流行库
fsspec文件系统支持:
- pyarrow: 内存数据布局引擎
- petl: 一个用于提取、转换和加载数据表的通用包。
安装
pip install fsspec
# 用于S3
pip install s3fs
# 用于GCS
pip install gcsfs
# 用于HDFS
pip install pyarrow
教程
AWS S3
AWS S3(Amazon Simple Storage Service)是亚马逊 AWS 提供的对象存储服务,具有高可用性、高扩展性和安全性,被广泛用于存储和检索任意类型的数据,从简单的文档到大型媒体文件和备份数据。
核心概念
-
Bucket(存储桶):
- S3 的基本存储容器,用于组织对象
- 名称在全球范围内唯一,需符合 DNS 命名规范
- 每个桶必须归属一个 AWS 区域
-
Object(对象):
- 存储在 S3 中的实际数据,由键(Key)、数据(Value)和元数据(Metadata)组成
- 键是对象在桶中的唯一标识符(类似文件名)
- 单个对象最大可存储 5TB
-
Region(区域):
- 数据物理存储的地理区域
- 选择合适区域可降低延迟并优化成本
-
S3 URL 格式:
- 虚拟托管风格:https://bucket-name.s3.Region.amazonaws.com/key-name
- 路径风格:https://s3.Region.amazonaws.com/bucket-name/key-name
主要特性
- 高持久性:设计为 99.999999999%(11 个 9)的持久性
- 高可用性:标准存储类别提供 99.99% 的可用性
- 无限存储:理论上可存储无限量的数据
- 安全性:
- 细粒度访问控制(IAM 策略、访问控制列表 ACL)
- 服务器端加密(SSE-S3、SSE-KMS、SSE-C)
- 客户端加密
- 支持 HTTPS 传输加密
- 版本控制:可保留对象的多个版本,防止意外删除或覆盖
- 生命周期管理:自动将数据从一个存储类别转移到另一个,优化成本
- 静态网站托管:可直接托管静态网站
存储类别
S3 提供多种存储类别以满足不同需求:
- S3 Standard:通用用途,低延迟、高吞吐量,适合频繁访问的数据
- S3 Intelligent-Tiering:自动在频繁访问和不频繁访问层之间移动数据
- S3 Standard-Infrequent Access (S3 Standard-IA):适合不常访问但需要快速访问的数据
- S3 One Zone-Infrequent Access (S3 One Zone-IA):与 Standard-IA 类似,但数据仅存储在一个可用区
- S3 Glacier Instant Retrieval:适合归档数据,需要毫秒级访问
- S3 Glacier Flexible Retrieval:适合归档数据,检索时间分钟级
- S3 Glacier Deep Archive:最低成本的归档存储,检索时间小时级
使用场景
- 静态网站托管
- 数据备份和恢复
- 大数据分析存储
- 媒体文件存储和分发
- 软件交付
- 日志和数据归档
示例
import boto3
# 创建S3客户端
s3 = boto3.client('s3')
# 创建存储桶
bucket_name = 'my-unique-bucket-name'
region = 'us-east-1'
s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={'LocationConstraint': region})
# 上传文件
file_path = 'local-file.txt'
object_key = 'remote-file.txt'
s3.upload_file(file_path, bucket_name, object_key)
# 下载文件
download_path = 'downloaded-file.txt'
s3.download_file(bucket_name, object_key, download_path)
# 列出桶中的对象
response = s3.list_objects_v2(Bucket=bucket_name)
for obj in response.get('Contents', []):
print(obj['Key'])
# 删除对象
s3.delete_object(Bucket=bucket_name, Key=object_key)
# 删除存储桶(需先清空桶)
s3.delete_bucket(Bucket=bucket_name)
使用fsspec
import fsspec
# 读取S3文件
with fsspec.open('s3://my-bucket/path/to/file.txt', 'r') as f:
content = f.read()
# 写入S3文件
with fsspec.open('s3://my-bucket/path/to/new-file.txt', 'w') as f:
f.write('Hello, S3!')
fsspec的使用
本地文件系统
mport fsspec
# 创建文件系统实例
fs = fsspec.filesystem('file')
# 列出目录内容
print(fs.ls('path/to/directory'))
# 创建目录
fs.mkdir('new_directory', exist_ok=True)
# 写入文件
with fs.open('new_file.txt', 'w') as f:
f.write('Hello, fsspec!')
# 读取文件
with fs.open('new_file.txt', 'r') as f:
print(f.read())
from fsspec.implementations.local import LocalFileSystem
# 本地文件
fs = LocalFileSystem()
fs = ZipFileSystem()
fs = S3FileSystem()
fs = fsspec.filesystem('file')
使用 URL 直接操作:
# 读取本地文件
with fsspec.open('file:///path/to/local/file.txt', 'r') as f:
print(f.read())
# 读取S3文件
with fsspec.open('s3://bucket-name/path/to/file.csv', 'r') as f:
df = pd.read_csv(f)
# 读取HTTP资源
with fsspec.open('https://example.com/data.csv', 'r') as f:
data = f.read()
递归操作
# 递归列出目录下所有文件
all_files = fs.find('path/to/directory')
# 递归删除目录
fs.rm('directory_to_delete', recursive=True)
缓存机制
fsspec 提供了缓存功能,可以将远程文件缓存到本地,提高访问速度:
# 使用缓存读取远程文件
with fsspec.open('s3://bucket/data.csv', cache=True) as f:
data = f.read()
配置与高级用法
# 配置S3访问密钥
s3_options = {
'key': 'access_key',
'secret': 'secret_key',
'client_kwargs': {'region_name': 'us-west-2'}
}
with fsspec.open('s3://bucket/data.csv', storage_options=s3_options) as f:
data = f.read()
1231

被折叠的 条评论
为什么被折叠?



