使用os.walk()遍历根目录查找Excel文件的问题及解决方法
问题描述
我需要遍历包含多层嵌套子文件夹的根目录,找出所有Excel文件并用pandas做数据分析。最初尝试用os.path.splitext(filename)[1] == ".xlsx"判断文件类型,但添加计数器后结果为0(预期找到85个文件),原代码如下:
import os import pandas as pd rootFolderPath = r'.' counter = 0 for root, dirs, files in os.walk(rootFolderPath): for filename in files: if os.path.isfile(os.path.splitext(filename)[1]) == ".xlsx": xlsx = pd.ExcelFile(filename) counter += 1 print(counter)
原代码错误分析
核心问题出在判断条件os.path.isfile(os.path.splitext(filename)[1]) == ".xlsx":
os.path.splitext(filename)[1]返回的是文件后缀(比如.xlsx),是字符串而非文件路径os.path.isfile()需要传入合法路径来判断是否为文件,传入后缀字符串会直接返回False,导致条件永远不成立,计数器始终为0
优化后的解决方案
针对三个核心需求做了优化:
- 兼容
.xlsx和.xlsm两种Excel文件后缀 - 过滤带
~前缀的Excel临时文件 - 正确拼接文件完整路径,避免pandas找不到文件
优化代码如下:
import os import pandas as pd rootFolderPath = r'.' valid_extensions = ('.xlsx', '.xlsm') counter = 0 for root, dirs, files in os.walk(rootFolderPath): for filename in files: # 过滤临时文件 + 判断合法后缀 if not filename.startswith('~') and filename.endswith(valid_extensions): # 跨平台拼接完整文件路径 full_file_path = os.path.join(root, filename) xlsx = pd.ExcelFile(full_file_path) counter += 1 print(f"找到有效Excel文件数量:{counter}")
代码说明
filename.endswith(valid_extensions):一次性匹配多种合法后缀,比手动截取字符串更简洁可靠filename.startswith('~'):直接过滤Excel生成的临时文件,逻辑清晰os.path.join(root, filename):跨平台拼接路径,避免手动用\拼接带来的兼容性问题
内容的提问来源于stack exchange,提问作者nami
相关产品推荐
相关产品推荐

