Python如何递归遍历嵌套字典 提取所有文件夹项并统计数量
统计任意深度嵌套书签文件夹的实现方案
你的书签数据是标准多叉树结构,且嵌套层级无上限,选择无递归深度风险的树遍历方案,即可同时完成文件夹总数统计、全量文件夹名称收集,不需要提前预判嵌套深度。
推荐方案:迭代式深度优先遍历(生产环境可用)
该方案用栈手动维护待遍历节点,完全不受Python默认递归深度上限(约1000层)的限制,哪怕极端场景下嵌套上万层也能正常运行:
def get_all_folders(bookmark_data): root = bookmark_data["bookmarks_tab"] folder_names = [] traverse_stack = [root] while traverse_stack: current = traverse_stack.pop() # 仅统计类型为folder的节点 if current.get("type") == "folder": folder_names.append(current["name"]) # 子节点倒序入栈可保持和自然层级一致的遍历顺序,无顺序要求可省略reversed for child in reversed(current.get("children", [])): traverse_stack.append(child) return len(folder_names), folder_names
调用方式
total_folder_count, all_folder_names = get_all_folders(data)
返回值第一个是文件夹总数量,第二个是按遍历顺序排列的所有文件夹名称列表,根目录bookmarks_tab默认会被计入统计。
备选方案:递归实现(代码简洁)
如果业务场景里不存在极端深的嵌套(普通用户书签嵌套几乎不会超过100层),可以用写法更简洁的递归实现:
def get_all_folders_recursive(node, result=None): if result is None: result = [] if node.get("type") == "folder": result.append(node["name"]) for child in node.get("children", []): get_all_folders_recursive(child, result) return len(result), result # 调用方式 total_folder_count, all_folder_names = get_all_folders_recursive(data["bookmarks_tab"])
注意:Python默认递归深度限制为1000左右,若嵌套层级超过阈值会触发
RecursionError,此时请切换为上面的迭代方案。
实现说明
- 两种方案都会自动遍历所有层级的子节点,不需要手动编写多层嵌套处理逻辑
- 自动过滤普通书签节点(非
folder类型),不会出现误统计 - 代码做了容错处理,节点缺失
children属性时不会抛出异常 - 如果需要排除根目录文件夹,只需要在收集名称时加判断跳过根节点即可
内容的提问来源于stack exchange,提问作者Aiden Ellis
相关产品推荐
相关产品推荐

