Python rich tree from dict

from rich.console import Console
from rich.tree import Tree

paths: dict = {
    'pyproject.toml': False,
    'docs': {
        'source': {
            'conf.py': True, 'index.rst': False, 'use_guide.rst': False, 'api.rst': False
        }
    },
    'mg_crp': {
        'main.py': False
    },
    '.readthedocs.yaml': True,
    'Makefile': True,
    'docsd': {
        'source': {
            'conf.py': True, 'index.rst': False,
            'use_guide.rst': False, 'api.rst': False
        },
        'sources': {
            'conf.py': True, 'index.rst': False,
            'use_guide.rst': False, 'api.rst': False
        }
    },
    '.gitignore': False,
    'README.md': False,
}

console_rich = Console()
tree = Tree("Path")
if __name__ == '__main__':

    def _self(keys, _tree):
        for _k, _v in keys.items():
            if type(_v) != dict:
                _tree.add(_k)
            else:
                _bk = _tree
                _tree = _tree.add(_k)
                _self(_v, _tree)
                _tree = _bk


    _self(paths, tree)
    console_rich.print(tree)

Ответ

    Path
├── pyproject.toml
├── docs
│   └── source
│       ├── conf.py
│       ├── index.rst
│       ├── use_guide.rst
│       └── api.rst
├── mg_crp
│   └── main.py
├── .readthedocs.yaml
├── Makefile
├── docsd
│   ├── source
│   │   ├── conf.py
│   │   ├── index.rst
│   │   ├── use_guide.rst
│   │   └── api.rst
│   └── sources
│       ├── conf.py
│       ├── index.rst
│       ├── use_guide.rst
│       └── api.rst
├── .gitignore
└── README.md

Ответы (1 шт):

Автор решения: Денис Кустов
def dict_to_tree(dict_: dict, tree_: Tree):
    def _self(keys, _tree):
        for _k, _v in keys.items():
            if type(_v) != dict:
                # Добавляем файл
                _tree.add(_k)
            else:
                # Для того чтобы вернутся на папку назад
                _bk = _tree
                # Добавляем папку
                _tree = _tree.add(_k)
                # Перебираем ключи
                _self(_v, _tree)
                # Возвращаемся на папку назад
                _tree = _bk

    _self(dict_, tree_)
    return tree_

console_rich = Console()
tree = Tree("Path")
res = dict_to_tree(paths, tree)
console_rich.print(res)
→ Ссылка