使用os.scandir遍历目录结构时触发FileNotFoundError的问题求助
解决os.chdir调用DirEntry对象导致的FileNotFoundError问题
我来帮你搞定这个报错!你遇到的问题核心在于对os.scandir()返回的DirEntry对象的用法理解有点偏差,咱们一步步拆解:
错误根源
os.scandir('data')返回的每个sub_folder都是DirEntry对象,而os.chdir()函数需要接收的是字符串类型的路径,直接把DirEntry对象传进去的话,Python会把它转换成类似<DirEntry 'run.0'>的字符串,这显然不是系统能识别的有效路径,所以才会抛出FileNotFoundError提示找不到data\\run.0。
快速修复方案
只需要调用DirEntry对象的path属性,就能拿到它对应的实际路径字符串,修改代码如下:
import os for sub_folder in os.scandir('data'): # 先判断是否是目录,避免处理data下的文件 if sub_folder.is_dir(): os.chdir(sub_folder.path) # 用path属性获取正确路径 # 遍历当前子文件夹时,基于当前工作目录扫描 for file in os.scandir(os.getcwd()): if file.name.endswith('params'): with open(file.name, 'r') as f: data = f.read() # 这里可以添加你的数据处理逻辑 # 记得切回上级目录,避免后续循环出错 os.chdir('..')
⚠️ 注意:切换目录后一定要记得切回上级目录,否则下一次循环的os.chdir(sub_folder.path)会基于当前子文件夹的路径去查找,大概率会再次报错。
更优的无切换目录方案
其实切换目录是个容易踩坑的操作,更健壮的写法是直接使用文件的完整路径,完全不需要切换目录:
import os for sub_folder in os.scandir('data'): if sub_folder.is_dir(): # 确保只处理子文件夹 # 遍历子文件夹下的所有文件,传入子文件夹的完整路径 for file in os.scandir(sub_folder.path): if file.name.endswith('params'): # 用file.path直接获取文件的完整路径,打开文件 with open(file.path, 'r') as f: data = f.read() # 这里添加你的数据处理逻辑,比如打印或存储数据 print(f"成功读取文件:{file.path}")
这种写法不仅避免了切换目录带来的潜在问题,代码逻辑也更清晰,后续维护起来更省心。
内容的提问来源于stack exchange,提问作者WeekendJedi
相关产品推荐
相关产品推荐

