Python遍历子目录XLSX文件时出现FileNotFoundError的解决方法
问题解决:遍历主目录及指定子目录XLSX文件并筛选
问题背景
需要遍历当前目录及指定子目录(2015-2018)中的XLSX文件,筛选出包含"2014"工作表的文件。当前代码能处理主目录文件,但子目录文件打开时报错[Errno 2] No such file or directory: '文件名'。
错误原因
- 第一段循环中,直接将子目录下的文件名追加到
files列表,后续打开文件时仅传入文件名,程序会在当前工作目录下查找,而非文件实际所在的子目录,导致找不到文件。 - 代码存在重复逻辑:既通过手动遍历指定子目录收集文件,又使用
os.walk遍历,容易引发混乱。
修复后的代码
import os import openpyxl path = os.getcwd() filtered_files_list = [] # 使用os.walk遍历指定子目录 for root, dirs, files in os.walk(path): # 仅处理目标子目录 if os.path.basename(root) in ['2018', '2017', '2016', '2015']: for f in files: if f.endswith('.xlsx'): # 拼接文件完整路径 full_file_path = os.path.join(root, f) try: wb = openpyxl.load_workbook(full_file_path) if "2014" in wb.sheetnames: # 可选择保存完整路径或仅文件名,按需调整 filtered_files_list.append(full_file_path) # 如果只需要文件名,用下面这行替换上面的: # filtered_files_list.append(f) except Exception as e: print(f"处理文件 {full_file_path} 时出错: {e}") # 同时处理主目录下的XLSX文件 for f in os.listdir(path): full_file_path = os.path.join(path, f) if os.path.isfile(full_file_path) and f.endswith('.xlsx'): try: wb = openpyxl.load_workbook(full_file_path) if "2014" in wb.sheetnames: filtered_files_list.append(full_file_path) # 按需替换为文件名:filtered_files_list.append(f) except Exception as e: print(f"处理文件 {full_file_path} 时出错: {e}") print(filtered_files_list)
关键修改点
- 统一使用完整路径:打开文件时必须传入
os.path.join(root, f)生成的完整路径,确保程序能定位到子目录中的文件。 - 简化逻辑:去掉手动遍历子目录的重复代码,用
os.walk统一处理指定子目录,同时单独处理主目录文件,逻辑更清晰。 - 增加异常捕获:添加
try-except块处理文件打开异常(如损坏的XLSX文件),避免程序中途崩溃。 - 优化子目录判断:用
os.path.basename(root) in 目标目录列表替代字符串后缀判断,更准确(避免出现类似xxx2018的目录被误判)。
内容的提问来源于stack exchange,提问作者hvahva
相关产品推荐
相关产品推荐

