← retour aux snippets

importlib.resources.files/as_file: accéder aux ressources d'un package

Lire un fichier de données packagé, même depuis une wheel/zip.

python import #files

objectif

Lire un fichier de données packagé, même depuis une wheel/zip.

code minimal

import importlib.resources as ir, types, tempfile, pathlib, sys
# Crée un package temporaire avec une ressource
with tempfile.TemporaryDirectory() as tmp:
    pkg_dir = pathlib.Path(tmp)/"mypkg"; pkg_dir.mkdir()
    (pkg_dir/"__init__.py").write_text("", encoding="utf-8")
    (pkg_dir/"data.txt").write_text("hello", encoding="utf-8")
    sys.path.insert(0, tmp)
    try:
        pkg = __import__("mypkg")
        path = ir.files(pkg) / "data.txt"
        with ir.as_file(path) as p:
            print(p.read_text() == "hello")  # attendu: True
    finally:
        sys.path.remove(tmp)

utilisation

import importlib.resources as ir, sys, tempfile, pathlib
with tempfile.TemporaryDirectory() as tmp:
    d = pathlib.Path(tmp)/"p"; d.mkdir(); (d/"__init__.py").write_text("")
    (d/"f.txt").write_text("x")
    sys.path.insert(0, tmp)
    try:
        pmod = __import__("p")
        print((ir.files(pmod)/"f.txt").name == "f.txt")
    finally:
        sys.path.remove(tmp)

variante(s) utile(s)

import importlib.resources as ir
print(hasattr(ir, "files") and hasattr(ir, "as_file"))

notes

  • Préférez files()/as_file aux chemins relatifs; compatible zipimport.
  • Évitez d’accéder à file directement pour des données packagées.