import os import types def _wrap_treedir_entry(ent, prefix=""): wrapped = types.SimpleNamespace() wrapped.name = f"{prefix}/{ent.name}" if prefix else ent.name wrapped.path = ent.path wrapped.is_dir = ent.is_dir wrapped.is_file = ent.is_file wrapped.is_symlink = ent.is_symlink return wrapped def treedir(root: str, prefix: str = ""): with os.scandir(root) as entries: for ent in entries: wrapped = _wrap_treedir_entry(ent, prefix) yield wrapped if wrapped.is_dir(follow_symlinks=False): yield from treedir(ent.path, wrapped.name)