fsspec 用法

fsspec 用法#

实例化一个文件系统: fsspec 提供了一个抽象的文件系统接口作为基类,供其他文件系统使用。一个文件系统实例是一个对象,用于操作远程存储、本地文件、某些包装器内的文件或其他任何能够生成类似文件的对象上的文件。

一些具体的实现与 fsspec 捆绑在一起,其他的可以单独安装。它们可以直接实例化,或者可以使用注册表来查找它们。

直接使用类名进行实例化,例如 LocalFileSystemZipFileSystemS3FileSystem

from fsspec.implementations.local import LocalFileSystem

fs = LocalFileSystem()

或者通过注册表查找:

import fsspec

fs = fsspec.filesystem('file')

这里传递的参数是协议名称,它映射到相应的实现类 LocalFileSystem。其他示例包括 zip,它映射到 ZipFileSystem,以及 s3,它映射到 S3FileSystem

许多文件系统还会接受额外的参数,其中一些可能是选项 - 请参阅 API 参考文档,或者使用 fsspec.get_filesystem_class() 获取类对象并检查其文档字符串。

import fsspec

fs = fsspec.filesystem('ftp', host=host, port=port, username=user, password=pw)

已实现的 fsspec 协议列表可以通过使用 fsspec.available_protocols() 来获取。

使用文件系统#

文件系统实例提供了大量方法,用于获取和操作给定后端的文件信息。尽管某些特定实现可能不提供所有功能(例如,http 是只读的),但通常所有正常操作,如 lsrm 等都应该可以正常工作(查看完整列表:fsspec.spec.AbstractFileSystem)。请注意,这个快速入门将优先使用 posix 风格的命名,但许多常见操作都有别名:例如,cp()copy() 是相同的。功能的选择通常尽可能接近内置 os 模块的工作方式,例如 glob。以下操作块应该看起来非常熟悉。

fs.mkdir("/remote/output")
fs.touch("/remote/output/success")  # creates empty file
assert fs.exists("/remote/output/success")
assert fs.isfile("/remote/output/success")
assert fs.cat("/remote/output/success") == b""  # get content as bytestring
fs.copy("/remote/output/success", "/remote/output/copy")
assert fs.ls("/remote/output", detail=False) == ["/remote/output/success", "/remote/output/copy")
fs.rm("/remote/output", recursive=True)

open() 方法将返回一个类似文件的对象,可以将其传递给任何其他期望处理 Python 文件的库,或者由您自己的代码像使用普通 Python 文件对象一样使用。这些通常只能是二进制模式,但可能会实现内部缓冲,以限制从远程源读取的次数。它们尊重上下文管理器的使用。例如,如果您安装了 pandas,您可以执行以下操作:

f = fs.open("/remote/path/notes.txt", "rb")
lines = f.readline()  # read to first b"\n"
f.seek(-10, 2)
foot = f.read()  # read last 10 bytes of file
f.close()

import pandas as pd
with fs.open('/remote/data/myfile.csv') as f:
    df = pd.read_csv(f, sep='|', header=None)

更高层次#

对于许多情况,唯一需要的函数是 fsspec.open_files(),它将返回由单个 URL 和传递给后端的参数创建的 fsspec.core.OpenFile 实例。这支持文本模式和即时压缩,并且这些对象可以在进程或机器之间进行序列化(只要每个都有访问相同后端文件系统的权限)。协议(即后端)是从传递的 URL 推断出来的,glob 字符在读取模式(搜索文件)或写入模式(创建名称)中展开。关键的是,后端系统上的文件实际上并没有打开,直到 OpenFile 实例在 with 上下文中使用。

of = fsspec.open("github://dask:fastparquet@main/test-data/nation.csv", "rt")
# of is an OpenFile container object. The "with" context below actually opens it
with of as f:
    # now f is a text-mode file
    for line in f:
        # iterate text lines
        print(line)
        if "KENYA" in line:
            break