Spec-Zone.ru › Python 3.13

importlib.resources — чтение, открытие и доступ к ресурсам пакета

Исходный код: Lib/importlib/resources/__init__.py

Добавлено в версии 3.7.

Этот модуль использует систему импорта Python, чтобы предоставлять доступ к ресурсам внутри пакетов.

«Ресурсы» — это ресурсы, похожие на файлы и связанные с модулем или пакетом в Python. Ресурсы могут находиться непосредственно в пакете, во вложенном каталоге этого пакета или рядом с модулями вне пакета. Ресурсы могут быть текстовыми или двоичными. Поэтому исходные файлы модулей Python (.py), артефакты компиляции (pycache) и артефакты установки (например, reserved filenames в каталогах) технически являются фактическими ресурсами этого пакета. Однако на практике ресурсами обычно считают только те артефакты, не относящиеся к Python, которые автор пакета специально предоставляет.

Ресурсы можно открывать и читать в двоичном или текстовом режиме.

Ресурсы в некотором смысле подобны файлам в каталогах, однако важно помнить, что это лишь метафора. Ресурсы и пакеты не обязаны существовать как физические файлы и каталоги в файловой системе: например, пакет и его ресурсы можно импортировать из ZIP-файла с помощью zipimport.

Примечание

Этот модуль предоставляет функциональность, аналогичную pkg_resources базовому доступу к ресурсам, но без дополнительных затрат производительности, связанных с этим пакетом. Благодаря этому ресурсы, включённые в пакеты, проще читать, а семантика становится более стабильной и согласованной.

В отдельном бэкпорте этого модуля содержится дополнительная информация об использовании importlib.resources и переходе с pkg_resources на importlib.resources.

Loaders, которым необходимо поддерживать чтение ресурсов, должны реализовать метод get_resource_reader(fullname), описанный в importlib.resources.abc.ResourceReader.

class importlib.resources.Anchor

Представляет якорь для ресурсов: объект module object или имя модуля в виде строки. Определяется как Union[str, ModuleType].

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

Возвращает объект Traversable, представляющий контейнер ресурсов (условно — каталог) и его ресурсы (условно — файлы). Traversable может содержать другие контейнеры (условно — вложенные каталоги).

anchor — необязательный параметр Anchor. Если якорем является пакет, ресурсы определяются относительно этого пакета. Если это модуль, ресурсы определяются рядом с ним (в том же пакете или в корне пакета). Если якорь не указан, используется модуль вызывающего кода.

Добавлено в версии 3.9.

Изменено в версии 3.12: Параметр package переименован в anchor. Теперь anchor может быть модулем, не являющимся пакетом, а если он не указан, по умолчанию используется модуль вызывающего кода. Параметр package по-прежнему принимается для совместимости, но вызывает предупреждение DeprecationWarning. Для совместимого интерфейса со старыми версиями Python передавайте якорь позиционно или используйте importlib_resources >= 5.10.

importlib.resources.as_file(traversable)

Для объекта Traversable, представляющего файл или каталог (обычно полученного с помощью importlib.resources.files()), возвращает менеджер контекста для использования в инструкции with. Менеджер контекста предоставляет объект pathlib.Path.

При выходе из менеджера контекста удаляется временный файл или каталог, созданный, например, при извлечении ресурса из ZIP-файла.

Используйте as_file, если методов Traversable (read_text и т. д.) недостаточно и требуется настоящий файл или каталог в файловой системе.

Добавлено в версии 3.9.

Изменено в версии 3.12: Добавлена поддержка объекта traversable, представляющего каталог.

Функциональный API

Доступен набор упрощённых вспомогательных функций с обратной совместимостью. Они позволяют выполнять распространённые операции одним вызовом функции.

Для всех перечисленных ниже функций:

  • anchor — это Anchor, как и в files(). В отличие от files, его нельзя опустить.
  • path_names — компоненты имени пути ресурса относительно якоря. Например, чтобы получить текст ресурса с именем info.txt, используйте:

    importlib.resources.read_text(my_module, "info.txt")
    

    Как и в случае с Traversable.joinpath, в качестве разделителей пути в отдельных компонентах следует использовать прямые косые черты (/). Например, следующие варианты эквивалентны:

    importlib.resources.read_binary(my_module, "pics/painting.png")
    importlib.resources.read_binary(my_module, "pics", "painting.png")
    

    Для обратной совместимости функции чтения текста требуют явного указания аргумента encoding, если задано несколько значений path_names. Например, чтобы получить текст info/chapter1.txt, используйте:

    importlib.resources.read_text(my_module, "info", "chapter1.txt",
                                  encoding='utf-8')
    
importlib.resources.open_binary(anchor, *path_names)

Открывает указанный ресурс для чтения в двоичном режиме.

Подробности о anchor и path_names см. во введении.

Эта функция возвращает объект BinaryIO, то есть двоичный поток, открытый для чтения.

Эта функция примерно эквивалентна следующему коду:

files(anchor).joinpath(*path_names).open('rb')

Изменено в версии 3.13: Допускается несколько значений path_names.

importlib.resources.open_text(anchor, *path_names, encoding='utf-8', errors='strict')

Открывает указанный ресурс для чтения текста. По умолчанию содержимое читается в строгой кодировке UTF-8.

Подробности о anchor и path_names см. во введении. encoding и errors имеют то же значение, что и во встроенной функции open().

Для обратной совместимости аргумент encoding необходимо указывать явно, если задано несколько значений path_names. Это ограничение планируется устранить в Python 3.15.

Эта функция возвращает объект TextIO, то есть текстовый поток, открытый для чтения.

Эта функция примерно эквивалентна следующему коду:

files(anchor).joinpath(*path_names).open('r', encoding=encoding)

Изменено в версии 3.13: Допускается несколько значений path_names. Аргументы encoding и errors необходимо задавать как именованные.

importlib.resources.read_binary(anchor, *path_names)

Читает и возвращает содержимое указанного ресурса в виде bytes.

Подробности о anchor и path_names см. во введении.

Эта функция примерно эквивалентна следующему коду:

files(anchor).joinpath(*path_names).read_bytes()

Изменено в версии 3.13: Допускается несколько значений path_names.

importlib.resources.read_text(anchor, *path_names, encoding='utf-8', errors='strict')

Читает и возвращает содержимое указанного ресурса в виде str. По умолчанию содержимое читается в строгой кодировке UTF-8.

Подробности о anchor и path_names см. во введении. encoding и errors имеют то же значение, что и во встроенной функции open().

Для обратной совместимости аргумент encoding необходимо указывать явно, если задано несколько значений path_names. Это ограничение планируется устранить в Python 3.15.

Эта функция примерно эквивалентна следующему коду:

files(anchor).joinpath(*path_names).read_text(encoding=encoding)

Изменено в версии 3.13: Допускается несколько значений path_names. Аргументы encoding и errors необходимо задавать как именованные.

importlib.resources.path(anchor, *path_names)

Предоставляет путь к ресурсу в виде фактического пути в файловой системе. Эта функция возвращает менеджер контекста для использования в инструкции with. Менеджер контекста предоставляет объект pathlib.Path.

При выходе из менеджера контекста удаляются все созданные временные файлы, например, когда ресурс необходимо извлечь из ZIP-файла.

Например, метод stat() требует фактический путь в файловой системе; его можно использовать следующим образом:

with importlib.resources.path(anchor, "resource.txt") as fspath:
    result = fspath.stat()

Подробности о anchor и path_names см. во введении.

Эта функция примерно эквивалентна следующему коду:

as_file(files(anchor).joinpath(*path_names))

Изменено в версии 3.13: Допускается несколько значений path_names. Аргументы encoding и errors необходимо задавать как именованные.

importlib.resources.is_resource(anchor, *path_names)

Возвращает True, если указанный ресурс существует, и False в противном случае. Эта функция не считает каталоги ресурсами.

Подробности о anchor и path_names см. во введении.

Эта функция примерно эквивалентна следующему коду:

files(anchor).joinpath(*path_names).is_file()

Изменено в версии 3.13: Допускается несколько значений path_names.

importlib.resources.contents(anchor, *path_names)

Возвращает итерируемый объект с элементами пакета или пути с указанным именем. Итерируемый объект возвращает имена ресурсов (например, файлов) и объектов, не являющихся ресурсами (например, каталогов), в виде str. Итерируемый объект не выполняет рекурсивный обход вложенных каталогов.

Подробности о anchor и path_names см. во введении.

Эта функция примерно эквивалентна следующему коду:

for resource in files(anchor).joinpath(*path_names).iterdir():
    yield resource.name

Устарело начиная с версии 3.11: Предпочтительно использовать описанную выше функцию iterdir(), которая предоставляет больше контроля над результатами и более широкие возможности.

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/importlib.resources.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API