How to recreate the tree organization in nested dictionnaries

Question:

I’ve a problem I have been struggling on for some time now. What I need to do is to check things for a large amount of data inside many folders. To keep track of what has been done I wanted to create a yaml file containing the tree organization of my data structure. Thus, the objective is to create nested dictionaries of the folders containing data.
The script I made is working, but it duplicates each folder and I don’t know how to call recursively the function to avoid this. Here is the code :

def load_tree_structure_as_dictionnary(current_dict):

    for dir_name in current_dict.keys():

        lst_sub_dir = [f.path for f in os.scandir(dir_name) if f.is_dir()]

        if lst_sub_dir == []:

            current_dict[dir_name]['correct_calibration'] = None

        else:
            for sub_dir in lst_sub_dir:

                current_dict[dir_name][sub_dir] = load_tree_structure_as_dictionnary( {sub_dir: {}} )

    return current_dict
init_dict = {data_path : {} }
full_dict = load_tree_structure_as_dictionnary(init_dict)

I know the error is in the recursive call, but I can’t create a new ‘sub_dir’ key if there isnt a dictionnary initialized ( hence the {sub_dir : {}} )
Also I am new to writing stackoverflow questions, lmk if something needs to be improved in the syntax.

Asked By: Bloux

||

Answers:

After changing current_dict[dir_name][sub_dir] = load_tree_structure_as_dictionnary( {sub_dir: {}} ) to current_dict[dir_name].update(load_tree_structure_as_dictionnary( {sub_dir: {}} )) your code will not duplicate the sub_dir.

def load_tree_structure_as_dictionnary(current_dict):

    for dir_name in current_dict.keys():

        lst_sub_dir = [f.path for f in os.scandir(dir_name) if f.is_dir()]

        if lst_sub_dir == []:

            current_dict[dir_name]['correct_calibration'] = None

        else:
            for sub_dir in lst_sub_dir:

                current_dict[dir_name].update(load_tree_structure_as_dictionnary( {sub_dir: {}} ))

    return current_dict
init_dict = {"venv" : {} }
full_dict = load_tree_structure_as_dictionnary(init_dict)
Answered By: Deepak Tripathi
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.