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

目录遍历问题:按直接层级关联子目录与根父目录

目录遍历与命名关联问题解决

目录结构

└── 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,导致跨层级错误拼接。修正思路:

  1. 仅处理当前目录的直接子目录,避免深度遍历
  2. 递归时传递当前命名前缀,确保仅关联直接父级的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:27:52