fsspec: 适用于Python的文件系统接口

简介

fsspec(Filesystem Spec)是一个 Python 库,它提供了一个统一的接口来访问各种文件系统和存储后端,无论它们是本地文件、网络存储还是云存储服务。它的核心思想是抽象出文件系统的通用操作,让用户可以用一致的方式处理不同类型的文件存储。

fsspec 提供了两个主要概念:

  • 一组具有统一 API 的文件系统类(即诸如 cp、rm、cat、mkdir 等函数),用于在一系列存储系统上提供操作;
  • 以及像 fsspec.open() 这样的顶级便捷函数,使你能够快速从 URL 获得一个类似文件的对象,以便与第三方库或你自己的代码一起使用。

核心功能与特点

  1. 统一接口:为各种文件系统提供相同的方法(如open()、ls()、mkdir()等),无需关心底层存储类型。
  2. 支持多种存储后端:
    • 本地文件系统
    • 网络存储(HTTP、FTP)
    • 云存储(AWS S3、Google Cloud Storage、Azure Blob Storage)
    • 分布式文件系统(HDFS)
    • 其他特殊文件系统(如内存文件系统、Zip 文件等)
  3. 延迟加载:只在需要时才加载特定存储系统的依赖库,避免不必要的依赖。
  4. 可扩展性:允许用户通过插件方式添加自定义文件系统。

使用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 提供的对象存储服务,具有高可用性、高扩展性和安全性,被广泛用于存储和检索任意类型的数据,从简单的文档到大型媒体文件和备份数据。

核心概念

  1. Bucket(存储桶):

    • S3 的基本存储容器,用于组织对象
    • 名称在全球范围内唯一,需符合 DNS 命名规范
    • 每个桶必须归属一个 AWS 区域
  2. Object(对象):

    • 存储在 S3 中的实际数据,由键(Key)、数据(Value)和元数据(Metadata)组成
    • 键是对象在桶中的唯一标识符(类似文件名)
    • 单个对象最大可存储 5TB
  3. Region(区域):

    • 数据物理存储的地理区域
    • 选择合适区域可降低延迟并优化成本
  4. S3 URL 格式:

    • 虚拟托管风格:https://bucket-name.s3.Region.amazonaws.com/key-name
    • 路径风格:https://s3.Region.amazonaws.com/bucket-name/key-name

主要特性

  1. 高持久性:设计为 99.999999999%(11 个 9)的持久性
  2. 高可用性:标准存储类别提供 99.99% 的可用性
  3. 无限存储:理论上可存储无限量的数据
  4. 安全性:
    • 细粒度访问控制(IAM 策略、访问控制列表 ACL)
    • 服务器端加密(SSE-S3、SSE-KMS、SSE-C)
    • 客户端加密
    • 支持 HTTPS 传输加密
  5. 版本控制:可保留对象的多个版本,防止意外删除或覆盖
  6. 生命周期管理:自动将数据从一个存储类别转移到另一个,优化成本
  7. 静态网站托管:可直接托管静态网站

存储类别

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:最低成本的归档存储,检索时间小时级

使用场景

  1. 静态网站托管
  2. 数据备份和恢复
  3. 大数据分析存储
  4. 媒体文件存储和分发
  5. 软件交付
  6. 日志和数据归档

示例

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()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值