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.files(anchor: Anchor | None = None)¶
返回一个
Traversable
对象,表示资源容器(可以理解为目录)及其资源(可以理解为文件)。Traversable 可能包含其他容器(可以理解为子目录)。anchor 是一个可选的
Anchor
。如果锚点是一个包,则从该包中解析资源。如果是一个模块,则从该模块中解析相邻的资源(在同一包或包根目录中)。如果省略锚点,则使用调用者的模块。在版本 3.9 中添加。
在版本 3.12 中更改:package 参数已重命名为 anchor。anchor 现在可以是非包模块,如果省略,则默认为调用者的模块。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 中打开的资源的名称;它可能不包含路径分隔符,并且可能没有子资源(即它不能是目录)。encoding 和 errors 与内置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')¶
读取并返回 package 中 resource 的内容,作为
str
。默认情况下,内容被读取为严格的 UTF-8。package 是一个名称或一个符合
Package
要求的模块对象。resource 是在 package 中打开的资源的名称;它可能不包含路径分隔符,并且可能没有子资源(即它不能是目录)。encoding 和 errors 与内置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()