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

Python递归目录搜索:无法获取正确当前工作目录的问题求助

Python递归目录搜索问题修复

问题场景

需要实现一个递归搜索目录的功能:

  • 函数find接收path(搜索起始路径)和target_dir(目标目录名)参数
  • 找到目标目录后输出其绝对路径
  • 需遍历所有子目录

测试文件夹结构:桌面tree目录下包含c文件夹(内有python目录)和直接的python目录,预期输出两个对应绝对路径,但运行参考代码后得到错误输出:

C:\Users\abc\Desktop\tree\c\python
C:\Users\abc\Desktop\tree\c\python\python

原代码问题分析

原代码使用os.chdir()切换工作目录,但递归调用后没有恢复初始工作目录,导致后续路径拼接时基于错误的工作目录生成重复路径;同时直接用字符串拼接路径的方式不具备跨平台兼容性,也容易出错。

修复方案1:基于绝对路径操作(推荐)

完全避免切换工作目录,直接用绝对路径处理所有条目,从根源避免工作目录混乱:

import os

class DirectorySearcher:
    def find(self, path, target_dir):
        # 转换为绝对路径,消除相对路径歧义
        abs_root = os.path.abspath(path)
        try:
            # 遍历当前路径下的所有条目
            for entry in os.listdir(abs_root):
                entry_full_path = os.path.join(abs_root, entry)
                # 仅处理目录
                if os.path.isdir(entry_full_path):
                    # 匹配到目标目录则输出绝对路径
                    if entry == target_dir:
                        print(entry_full_path)
                    # 递归搜索子目录
                    self.find(entry_full_path, target_dir)
        except OSError:
            # 跳过无法访问的目录
            return

directory_searcher = DirectorySearcher()
directory_searcher.find("./tree", "python")

方案优势:

  • 用os.path.abspath统一路径格式,避免相对路径带来的混乱
  • os.path.join自动适配不同操作系统的路径分隔符(Windows的\、Linux的/)
  • 全程基于绝对路径操作,无需切换工作目录,彻底规避目录切换后的恢复问题
  • 先判断条目为目录再处理,避免将文件传入递归逻辑

修复方案2:恢复工作目录

如果坚持使用os.chdir,可以通过try-finally确保递归前后工作目录一致:

import os

class DirectorySearcher:
    def find(self, path, target_dir):
        # 保存当前工作目录
        original_dir = os.getcwd()
        try:
            os.chdir(path)
            current_dir = os.getcwd()
            for entry in os.listdir("."):
                entry_path = os.path.join(current_dir, entry)
                if os.path.isdir(entry_path):
                    if entry == target_dir:
                        print(entry_path)
                    self.find(entry_path, target_dir)
        except OSError:
            return
        finally:
            # 无论是否出错,强制恢复初始工作目录
            os.chdir(original_dir)

directory_searcher = DirectorySearcher()
directory_searcher.find("./tree", "python")

方案说明:

每次进入递归前保存当前工作目录,执行完递归逻辑后(无论是否抛出异常),通过finally块切回原工作目录,保证后续路径拼接的正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:33:27