You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用嵌套字典重建目录树?递归调用致目录重复问题求解

问题描述

需要处理多文件夹中的大量数据,为跟踪处理进度,想要生成包含目录结构树的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)}

代码解释

  1. 函数参数改为直接接收目录路径,不再传入字典,避免了原代码中多余的字典包装。
  2. 每个目录对应的结构由函数直接生成并返回,上层目录直接将这个返回值作为子目录键的值,不会出现重复嵌套。
  3. 空目录的处理逻辑保持不变,添加correct_calibration: None的标记。

关于Stack Overflow提问的小建议

  • 代码块要指定语言(比如```python),方便语法高亮。
  • 可以补充一个错误示例输出和期望输出,让问题更直观。
  • 明确说明使用的Python版本,避免环境差异导致的问题。

内容的提问来源于stack exchange,提问作者Bloux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:25:29