Python新手如何在文件遍历脚本中添加多候选文件名匹配选项
os.walk多目标文件匹配的最简实现
核心结论:完全不需要堆叠多组if/else分支做逐次判断,用列表统一管理候选文件名的方案,代码量更少、后续加新候选也更方便。
第一步:统一管理候选目标
把已知的所有待匹配文件名,按你想要的检索优先级整理成一个固定列表,优先级越高的文件名放越靠前:
# 按优先级排序:优先找Unicorn 1.pdf,找不到再找Unicorn 2.pdf,最后找Apple 1.pdf TARGET_CANDIDATES = ["Unicorn 1.pdf", "Unicorn 2.pdf", "Apple 1.pdf"] found_results = [] # 存储已匹配到的文件完整路径
第二步:替换原有单目标的if判断
原来你写的单文件判断逻辑:
# 原有逻辑 if filename.endswith("Unicorn 1.pdf"): # 记录匹配文件
直接替换为列表成员判断就行,不需要额外加else:
# 遍历每个文件时的匹配逻辑 if filename in TARGET_CANDIDATES: file_full_path = os.path.join(root, filename) found_results.append(file_full_path) # 匹配成功后把该文件名从候选列表移除,避免重复统计 TARGET_CANDIDATES.remove(filename)
优化的小细节
加循环终止逻辑:如果所有候选文件都已经匹配到,直接中断os.walk的遍历,不用硬扫完整个C盘,省时间
加权限异常忽略:扫C盘时会遇到系统目录无权限读取的问题,给os.walk加个
onerror=lambda err: None参数,避免脚本中途崩溃直接使用文件名做成员判断:os.walk返回的
files列表里的元素都是不带路径的纯文件名,不需要额外做切分就能直接和候选列表比对,比原来的endswith匹配更精准,不会出现后缀相似但名字不对的误匹配完整可直接运行的参考代码:
import os TARGET_CANDIDATES = ["Unicorn 1.pdf", "Unicorn 2.pdf", "Apple 1.pdf"] found_results = [] # 遍历C盘,遇到无权限的目录直接跳过不报错 for root, dirs, files in os.walk("C:\\", onerror=lambda err: None): for filename in files: if filename in TARGET_CANDIDATES: full_path = os.path.join(root, filename) found_results.append(full_path) TARGET_CANDIDATES.remove(filename) # 所有候选都找齐了,直接终止遍历 if not TARGET_CANDIDATES: break if not TARGET_CANDIDATES: break print(f"最终匹配到的文件:{found_results}")
常见误区说明
你之前考虑的「在现有if分支后加else匹配其余候选」的写法,本质是逐次硬编码判断:
# 冗余的硬编码写法,加一个候选就要改一次分支 if filename == "Unicorn 1.pdf": 记录匹配 elif filename == "Unicorn 2.pdf": 记录匹配 elif filename == "Apple 1.pdf": 记录匹配这种写法代码冗余度高,后续新增候选文件时必须改动判断分支逻辑,远不如列表统一管理的方式灵活。
内容的提问来源于stack exchange,提问作者Mario1sqr141402
相关产品推荐
相关产品推荐

