J'essaie de construire une structure suivante à l'aide de Python voici mon code p> Le code ci-dessus crée une structure: p> logique et explication: p> Chaque fois que je rencontre mais malheureusement la valeur du drapeau code> 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. P> Remarque: Veuillez ignorer s'il y a désactivé le nom du dossier dans l'arborescence et le code. C'est juste un exemple. Em> p> p> Liste code>, je définis drapeau = faux code> de sorte que Je peux aller 1 étape pour la prochaine itération lorsque la valeur est dict code>. P>
3 Réponses :
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)
Merci, cela a fonctionné comme prévu. Je suppose qu'utiliser pour code> boucle avant si code> causait le problème.
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)
jette une erreur attributeError: 'str' objet n'a aucun attribut 'joinpath' code>
oups en arrière.
Ceci est une version qui permet une liste code> code> à contient autre dict code> s: