Python遍历多级目录读取smm_logs日志路径的代码问题求解
问题场景
目标读取D:\Coding\iroiro\ChuckRep路径下的两类日志:目录下有a、b、c、d四个非日志文件夹,以及e、f、g、h四个存储日志的子文件夹,日志分别是C000类.smm_logs文件、文件名带W标识的.smm_logs文件,需要遍历所有日志目录,正确输出两类日志的完整路径。
原代码存在的错误
- 通配路径层级错误:写的
./ChuckRep/*/*/会匹配两层子目录,实际日志只存在于ChuckRep下的一级子文件夹(e/f/g/h)中,多写一层通配符根本扫不到目标目录 - 扩展名判断逻辑完全失效:
os.path.splitext是对写死的通配字符串做拆分,不是对实际遍历到的文件操作,拿到的ext是空值,永远进不了后续的日志匹配逻辑 - 路径拼接方式错误:靠对固定字符串做
[:-4]切片拼接路径,既不兼容Windows路径分隔符,也容易因为字符串长度变化出现索引错误、路径拼接错乱 - 无容错处理:直接取glob匹配结果的第一个元素,只要某个目录下缺C000日志就会直接抛索引错误中断运行
修正后可运行代码
import os import glob # 配置日志根目录,用绝对路径避免工作目录变动导致匹配失败 root_dir = r'D:\Coding\iroiro\ChuckRep' # 遍历根目录下所有一级子项 for item_path in glob.glob(os.path.join(root_dir, '*')): # 跳过文件,只处理子文件夹 if not os.path.isdir(item_path): continue # 匹配当前文件夹下的两类目标日志 cfile_list = glob.glob(os.path.join(item_path, 'C000*.smm_logs')) wfile_list = glob.glob(os.path.join(item_path, '*W*.smm_logs')) # 输出匹配结果 if cfile_list: cfile_path = cfile_list[0] print(f'C000类日志路径:{cfile_path}') if wfile_list: for wfile_path in wfile_list: print(f'W类smm_logs日志路径:{wfile_path}')
调整点说明
- 路径匹配层级修正为一级子目录,和实际日志存储结构一致
- 用
os.path.join做路径拼接,自动适配Windows系统的反斜杠路径分隔符,不需要手动处理字符串切片 - 移除了无效的全局扩展名判断,改为在每个子文件夹内单独匹配对应规则的日志,匹配规则和日志命名特征完全对应
- 增加目录类型校验,自动跳过根目录下的非文件夹项,不会误扫无关目录内容
- 增加匹配结果非空判断,不会因为某个目录缺日志就直接报错中断
内容的提问来源于stack exchange,提问作者Kodasol
相关产品推荐
相关产品推荐

