目录遍历问题:按直接层级关联子目录与根父目录
目录遍历与命名关联问题解决
目录结构
└── names ├── name1 │ └── subdir1 │ ├── subnames │ │ └── cool │ │ ├── another-subdir1 │ │ │ ├── file │ │ │ │ ├── file.txt │ │ │ ├── subnames │ │ │ │ ├── awesome │ │ │ │ │ └── another-subdir2 │ │ │ │ │ ├── files │ │ │ │ │ │ ├── file.txt │ │ │ │ │ ├── subname │ │ │ │ │ │ └── super-awesome │ │ │ │ │ │ └── another-subdir3 │ │ │ │ │ │ ├── file │ │ │ │ │ │ │ ├── file.txt │ │ │ │ └── great │ │ │ │ └── great-subdir1 │ │ │ │ ├── random-name │ │ │ │ │ ├── file.txt └── name2 └── subdir2 ├── subnames │ └── nice │ ├── file.txt
问题详情
需要实现将子目录名按直接父级subnames目录向上关联至根父目录(name1、name2),用短横线连接,但现有代码输出不符合预期。
现有代码
import os def get_full_names(parent_dir): names = [] for dir_name in os.scandir(parent_dir): if dir_name.is_dir(): names.append(dir_name.name) subname_dir = os.path.join(parent_dir, dir_name.name) for root, dirs, files in os.walk(subname_dir): if 'subnames' in dirs: subnames = get_full_names(os.path.join(root, 'subnames')) for subname in subnames: names.append(f"{subname}-{dir_name.name}") return names parent_dir = '/path/to/names' names = get_full_names(parent_dir) print(names)
当前输出
['name1', 'cool-name1', 'great-cool-name1', 'awesome-cool-name1', 'super-awesome-awesome-cool-name1', 'super-awesome-cool-name1', 'great-name1', 'awesome-name1', 'super-awesome-awesome-name1', 'super-awesome-name1', 'name2', 'nice-name2']
期望输出
['name1', 'cool-name1', 'awesome-cool-name1', 'super-awesome-awesome-cool-name1', 'great-cool-name1', 'name2', 'nice-name2']
需要排除的项及原因
super-awesome-cool-name1:super-awesome不是subnames/cool的直接子目录great-name1:great不是names/name1的直接子目录awesome-name1:awesome不是names/name1的直接子目录super-awesome-awesome-name1、super-awesome-name1:同理,均不满足"直接父级为subnames目录"的关联规则
修正方案
问题核心是原代码的递归逻辑和os.walk会遍历所有层级的subnames,导致跨层级错误拼接。修正思路:
- 仅处理当前目录的直接子目录,避免深度遍历
- 递归时传递当前命名前缀,确保仅关联直接父级的
subnames目录
修正后代码
import os def get_full_names(parent_dir, prefix=None): names = [] for entry in os.scandir(parent_dir): if entry.is_dir(): # 拼接当前目录名与前缀(如果有) current_name = f"{entry.name}-{prefix}" if prefix else entry.name names.append(current_name) # 检查当前目录下是否存在直接的subnames子目录 subnames_path = os.path.join(entry.path, 'subnames') if os.path.isdir(subnames_path): # 递归处理subnames,传递当前目录名作为前缀 sub_names = get_full_names(subnames_path, prefix=entry.name) names.extend(sub_names) return names parent_dir = '/path/to/names' names = get_full_names(parent_dir) print(names)
代码说明
- 新增
prefix参数,用于传递当前目录需要关联的父级名称 - 仅检查当前目录的直接子目录,避免
os.walk捕获非直接父级的subnames - 只有当前目录下存在直接的
subnames目录时才递归处理,确保命名关联的层级正确性
内容的提问来源于stack exchange,提问作者ayuuk ja'ay
相关产品推荐
相关产品推荐

