importlib.resources – 包资源读取、打开和访问

源代码: Lib/importlib/resources/__init__.py


在版本 3.7 中添加。

此模块利用 Python 的导入系统来提供对资源的访问。

“资源”是与 Python 中的模块或包关联的文件类资源。资源可能直接包含在一个包中,包含在该包中包含的子目录中,或包含在包外部的模块中。资源可以是文本或二进制。因此,包的 Python 模块源代码 (.py) 和编译工件 (pycache) 在技术上是该包的实际资源。然而,实际上,资源主要是包作者专门公开的非 Python 工件。

资源可以在二进制或文本模式下打开或读取。

资源大致类似于目录中的文件,但请务必记住,这只是一个比喻。资源和包不必作为文件系统上的物理文件和目录存在:例如,可以使用 zipimport 从 zip 文件导入包及其资源。

注意

此模块提供类似于 pkg_resources 基本资源访问 的功能,但没有该包的性能开销。这使得读取包含在包中的资源变得更加容易,并具有更稳定和一致的语义。

此模块的独立反向移植提供了有关 使用 importlib.resources从 pkg_resources 迁移到 importlib.resources 的更多信息。

加载器如果希望支持资源读取,应实现 get_resource_reader(fullname) 方法,如 importlib.resources.abc.ResourceReader 所指定。

importlib.resources.Anchor

表示资源的锚点,可以是 模块 对象,也可以是字符串形式的模块名称。定义为 Union[str, ModuleType]

importlib.resources.files(anchor: Anchor | None = None)

返回一个 Traversable 对象,表示资源容器(可以理解为目录)及其资源(可以理解为文件)。Traversable 可能包含其他容器(可以理解为子目录)。

anchor 是一个可选的 Anchor。如果锚点是一个包,则从该包中解析资源。如果是一个模块,则从该模块中解析相邻的资源(在同一包或包根目录中)。如果省略锚点,则使用调用者的模块。

在版本 3.9 中添加。

在版本 3.12 中更改:package 参数已重命名为 anchoranchor 现在可以是非包模块,如果省略,则默认为调用者的模块。package 仍然被接受以保持兼容性,但会引发 DeprecationWarning。考虑按位置传递锚点或使用 importlib_resources >= 5.10 在较旧的 Python 上获得兼容的接口。

importlib.resources.as_file(traversable)

给定一个表示文件或目录的 Traversable 对象,通常来自 importlib.resources.files(),返回一个上下文管理器以用于 with 语句。上下文管理器提供一个 pathlib.Path 对象。

退出上下文管理器会清理从例如 zip 文件中提取资源时创建的任何临时文件或目录。

当 Traversable 方法(read_text 等)不足且需要文件系统上的实际文件或目录时,使用 as_file

在版本 3.9 中添加。

在版本 3.12 中更改:添加了对表示目录的 traversable 的支持。

已弃用的函数

一组较旧的已弃用函数仍然可用,但计划在未来版本的 Python 中将其移除。这些函数的主要缺点是它们不支持目录:它们假设所有资源都直接位于 中。

importlib.resources.Package

每当函数接受 Package 参数时,你可以传入 module object 或一个模块名称作为字符串。你只能传入 __spec__.submodule_search_locations 不是 None 的模块对象。

Package 类型定义为 Union[str, ModuleType]

自版本 3.12 起已弃用。

importlib.resources.Resource

对于以下函数的 资源 参数,你可以传入资源名称作为字符串或 path-like object

Resource 类型定义为 Union[str, os.PathLike]

importlib.resources.open_binary(package, resource)

package 中以二进制读取方式打开 resource

package 是一个名称或符合 Package 要求的模块对象。resource 是在 package 中打开的资源的名称;它可能不包含路径分隔符,并且可能没有子资源(即它不能是目录)。此函数返回一个 typing.BinaryIO 实例,这是一个用于读取的二进制 I/O 流。

从 3.11 版本开始已弃用:对该函数的调用可以通过以下方式替换

files(package).joinpath(resource).open('rb')
importlib.resources.open_text(package, resource, encoding='utf-8', errors='strict')

package 中以文本读取方式打开 resource。默认情况下,资源以 UTF-8 方式打开以进行读取。

package 是一个名称或符合 Package 要求的模块对象。resource 是在 package 中打开的资源的名称;它可能不包含路径分隔符,并且可能没有子资源(即它不能是目录)。encodingerrors 与内置 open() 的含义相同。

此函数返回一个 typing.TextIO 实例,这是一个用于读取的文本 I/O 流。

从 3.11 版本开始已弃用:对该函数的调用可以通过以下方式替换

files(package).joinpath(resource).open('r', encoding=encoding)
importlib.resources.read_binary(package, resource)

读取 package 中的 resource 的内容并将其作为 bytes 返回。

package 是一个名称或符合 Package 要求的模块对象。resource 是在 package 中打开的资源的名称;它可能不包含路径分隔符,并且可能没有子资源(即它不能是目录)。此函数返回资源的内容作为 bytes

从 3.11 版本开始已弃用:对该函数的调用可以通过以下方式替换

files(package).joinpath(resource).read_bytes()
importlib.resources.read_text(package, resource, encoding='utf-8', errors='strict')

读取并返回 packageresource 的内容,作为 str。默认情况下,内容被读取为严格的 UTF-8。

package 是一个名称或一个符合 Package 要求的模块对象。resource 是在 package 中打开的资源的名称;它可能不包含路径分隔符,并且可能没有子资源(即它不能是目录)。encodingerrors 与内置 open() 的含义相同。此函数将资源的内容作为 str 返回。

从 3.11 版本开始已弃用:对该函数的调用可以通过以下方式替换

files(package).joinpath(resource).read_text(encoding=encoding)
importlib.resources.path(package, resource)

resource 的路径作为实际的文件系统路径返回。此函数返回一个上下文管理器,用于 with 语句。上下文管理器提供一个 pathlib.Path 对象。

退出上下文管理器会清理在需要从例如 zip 文件中提取资源时创建的任何临时文件。

package 是一个名称或一个符合 Package 要求的模块对象。resource 是在 package 中打开的资源的名称;它可能不包含路径分隔符,并且可能没有子资源(即它不能是目录)。

自版本 3.11 起已弃用:可以使用 as_file() 替换对该函数的调用

as_file(files(package).joinpath(resource))
importlib.resources.is_resource(package, name)

如果包中存在名为 name 的资源,则返回 True,否则返回 False。此函数不认为目录是资源。package 是一个名称或一个符合 Package 要求的模块对象。

从 3.11 版本开始已弃用:对该函数的调用可以通过以下方式替换

files(package).joinpath(resource).is_file()
importlib.resources.contents(package)

返回包中已命名项的可迭代对象。可迭代对象返回 str 资源(例如文件)和非资源(例如目录)。可迭代对象不会递归到子目录中。

package 是一个名称或一个符合 Package 要求的模块对象。

从 3.11 版本开始已弃用:对该函数的调用可以通过以下方式替换

(resource.name for resource in files(package).iterdir() if resource.is_file())