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
相关产品推荐
相关产品推荐

