
本文介绍如何修改 python 文件移动脚本,将原本仅支持 `startswith()` 和 `endswith()` 的精确边界匹配,升级为支持用户输入关键词的**子串包含匹配**(如查找文件名中含 "356333"),大幅提升对合同号、客户号等非固定位置标识符的检索灵活性。
在实际办公自动化场景中,用户常需根据合同编号、客户ID或项目代号等片段信息批量整理文件——而这些标识符往往出现在文件名中间(如 invoice_2024_356333_final.pdf 或 report_356333_summary.xlsx),无法用 startswith() 或 endswith() 可靠捕获。此时,Python 原生的 in 成员运算符就是最简洁、高效且语义清晰的解决方案。
只需将原脚本中第 6 步的判断逻辑:
if entry.startswith(filename_match):
替换为:
if filename_match in entry:
即可实现「文件名任意位置包含关键词」的匹配逻辑。in 运算符会自动检查 filename_match 字符串是否作为子串出现在 entry(文件名)中,不区分大小写?——默认是区分的,如需忽略大小写,可统一转小写处理:
立即学习“Python免费学习笔记(深入)”;
if filename_match.lower() in entry.lower():
此外,为增强脚本健壮性与用户体验,建议补充以下改进:
- ✅ 路径拼接安全化:使用 os.path.join() 替代字符串拼接,避免因路径末尾斜杠缺失导致的错误;
- ✅ 文件过滤强化:跳过目录项(只处理文件),防止 shutil.move() 对文件夹报错;
- ✅ 匹配结果反馈:打印成功移动的文件名,便于验证;
- ✅ 空输入防护:校验 filename_match 非空,避免误匹配所有文件。
优化后的核心循环示例如下:
for entry in entries:
full_path = os.path.join(movefrom_path, entry)
if os.path.isfile(full_path) and filename_match.lower() in entry.lower():
shutil.move(full_path, os.path.join(moveto_path, entry))
print(f"✓ Moved: {entry}")⚠️ 注意事项: in 匹配是子串匹配,若输入过短(如 "a"),可能意外匹配大量文件(如 "apple.txt"、"data.csv"),建议提示用户输入具有业务唯一性的关键词; 如需正则高级匹配(如“以数字开头、含356333、后跟下划线”),可引入 re.search(pattern, entry),但对大多数合同号场景,in 已足够简洁可靠; 移动操作不可逆,请首次运行前备份源目录,或先用 print() 替代 shutil.move() 进行模拟测试。
至此,你的文件移动脚本已从“前缀/后缀限定器”升级为“智能片段定位器”,真正适配真实业务中灵活多变的命名习惯。










