如何用嵌套字典重建目录树?递归调用致目录重复问题求解
问题描述
需要处理多文件夹中的大量数据,为跟踪处理进度,想要生成包含目录结构树的YAML文件,目标是用嵌套字典构建带数据的目录结构。当前脚本可运行,但会重复每个目录,不清楚如何正确递归调用函数避免该问题。
现有代码
import os 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)
已知问题出在递归调用部分,但不初始化字典就无法创建新的sub_dir键(因此用了{sub_dir : {}})。另外刚接触Stack Overflow提问,若语法有需改进之处请告知。
解决方案
你的问题核心是递归调用时的字典结构嵌套错误——每次递归都传入{sub_dir: {}},导致返回的字典里会多一层以sub_dir为键的嵌套,最终出现重复目录的情况。
修正思路:递归函数应该直接操作当前目录对应的子字典,而不是包装成新的字典传入。可以调整函数逻辑,让函数接收目录路径而非字典,直接返回该目录对应的子结构字典,这样更简洁也避免嵌套错误。
修正后的代码
import os def load_tree_structure_as_dictionary(dir_path): # 初始化当前目录对应的字典 dir_dict = {} # 获取当前目录下的所有子目录 sub_dirs = [f.path for f in os.scandir(dir_path) if f.is_dir()] if not sub_dirs: # 没有子目录时添加标记 dir_dict['correct_calibration'] = None else: # 递归处理每个子目录,直接将返回的字典作为当前字典的键值 for sub_dir in sub_dirs: dir_dict[sub_dir] = load_tree_structure_as_dictionary(sub_dir) return dir_dict # 初始化调用,直接传入根目录路径 full_dict = {data_path: load_tree_structure_as_dictionary(data_path)}
代码解释
- 函数参数改为直接接收目录路径,不再传入字典,避免了原代码中多余的字典包装。
- 每个目录对应的结构由函数直接生成并返回,上层目录直接将这个返回值作为子目录键的值,不会出现重复嵌套。
- 空目录的处理逻辑保持不变,添加
correct_calibration: None的标记。
关于Stack Overflow提问的小建议
- 代码块要指定语言(比如```python),方便语法高亮。
- 可以补充一个错误示例输出和期望输出,让问题更直观。
- 明确说明使用的Python版本,避免环境差异导致的问题。
内容的提问来源于stack exchange,提问作者Bloux
相关产品推荐
相关产品推荐

