fsspec
用法#
实例化一个文件系统:
fsspec
提供了一个抽象的文件系统接口作为基类,供其他文件系统使用。一个文件系统实例是一个对象,用于操作远程存储、本地文件、某些包装器内的文件或其他任何能够生成类似文件的对象上的文件。
一些具体的实现与 fsspec
捆绑在一起,其他的可以单独安装。它们可以直接实例化,或者可以使用注册表来查找它们。
直接使用类名进行实例化,例如 LocalFileSystem
、ZipFileSystem
或 S3FileSystem
:
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
是只读的),但通常所有正常操作,如 ls
、rm
等都应该可以正常工作(查看完整列表: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