0
votes

Construire une structure de répertoire à l'aide de Python avec récursivité

J'essaie de construire une structure suivante à l'aide de Python xxx

voici mon code xxx

Le code ci-dessus crée une structure: xxx

logique et explication:

Chaque fois que je rencontre Liste , je définis drapeau = faux de sorte que Je peux aller 1 étape pour la prochaine itération lorsque la valeur est dict .

mais malheureusement la valeur du drapeau variable ne change pas. Je ne peux pas avoir la tête autour de moi pourquoi la valeur ne change pas, c'est toujours 1.

Remarque: Veuillez ignorer s'il y a désactivé le nom du dossier dans l'arborescence et le code. C'est juste un exemple.


0 commentaires

3 Réponses :


1
votes

Chaque fois que vous appelez la fonction, vous devez passer le nouveau chemin d'accès à la fonction non du chemin de base

import os
import argparse


base_path = r"<base directory path>"

# level_zero = "Baseframework"
levels = {"Baseframework":{"0_src":{"Appfun":["Cpugeneric", "i5t", "Tricore", "vpprint"], "Base":["ills","gnfru","service"]},
                           "1_toolbar":{"0_build":["0_utilities", "1_config", "9_make"]},
                           "2_out": ["ist_tasking","tricore_gyne"]}}

def func(data, path):
    new_path = ''
    if isinstance(data, dict):
        for k, v in data.items():
            new_path = os.path.join(path, k)
            os.mkdir(new_path)
            func(v, new_path)
    elif isinstance(data, list):
        for _dir in data:
            new_path = os.path.join(path, _dir)
            os.mkdir(new_path)
    else:
        exit(0)

func(levels, base_path)


1 commentaires

Merci, cela a fonctionné comme prévu. Je suppose qu'utiliser pour boucle avant si causait le problème.



1
votes

Je suggérerais d'utiliser PathLib pour cela pour tout Python 3.6+

from pathlib import Path

base_path = Path("c:/usr")

levels = {"Baseframework":{"0_src":{"Appfun":["Cpugeneric", "i5t", "Tricore", "vpprint"], "Base":["ills","gnfru","service"]},
                           "1_toolbar":{"0_build":["0_utilities", "1_config", "9_make"]},
                           "2_out": ["ist_tasking","tricore_gyne"]}}

def iterdict(d:dict, bd: Path):
    """recursively creates directory structure from dictionaries"""
    for k,v in d.items():
        if isinstance(v, dict):
            bd.pathjoin(k).mkdir(exist_ok=True)
            iterdict(v, bd.pathjoin(k))
        else:
            for file in v:
                bd.pathjoin(k).mkdir(exist_ok=True)


iterdict(levels, base_path)


2 commentaires

jette une erreur attributeError: 'str' objet n'a aucun attribut 'joinpath'


oups en arrière.



1
votes

Ceci est une version qui permet une liste à contient autre dict s: xxx


0 commentaires