关键词应小写化后用子串模糊匹配(如keyword.lower() in filename.lower())以提升鲁棒性,避免硬编码全等或复杂正则;路径须用os.path.join()构造并提前创建目标目录,移动前检查同名文件以防覆盖,建议先复制再删除确保安全。

直接用 os 和 shutil 就能搞定,不需要额外框架或 GUI 库;关键在关键词匹配逻辑和路径安全处理,否则容易误移、覆盖或权限失败。
关键词怎么定义才不容易漏匹配?
硬编码字符串列表太死板,实际文件名常含空格、大小写混杂、带扩展名或前后缀。建议用小写化 + 子串模糊匹配,而不是全等或正则起步。
-
keyword.lower() in filename.lower()比==更鲁棒,能捕获report_v2.pdf里的report - 避免用
str.split()或re.match()做首词匹配——很多发票命名是2024-05-12_发票_XX公司.pdf,关键词在中间 - 如果需精确匹配(如只归类 “invoice” 开头的),再上
filename.lower().startswith("invoice")
移动文件时为什么总报 PermissionError 或 FileNotFoundError?
不是脚本写错了,大概率是路径没处理好:源路径没加 os.path.join(),目标目录不存在,或用了相对路径但当前工作目录不一致。
librosa 是一个用于音频和音乐分析的 Python 库。它提供了特征提取、频谱分析、节拍跟踪、起始检测和音频可视化的工具,基于 NumPy 和 SciPy 构建,用于科学音频计算。
- 永远用
os.path.join(root, filename)构造源路径,别拼字符串 - 移动前必须调用
os.makedirs(target_dir, exist_ok=True),否则第一次运行就崩 - 用
os.path.abspath()打印调试路径,确认你操作的真是目标文件夹,不是脚本所在目录下的子目录
怎么防止把同名文件覆盖掉?
直接 shutil.move() 不检查重名,一旦目标已有同名文件,Windows 会报错,Linux 可能静默覆盖——这比归错类更危险。
- 先用
os.path.exists(dest_path)判断,存在就改名,比如加_dup1后缀 - 更稳妥的做法是用
shutil.copy2()复制+保留时间戳,确认无误后再os.remove()原文件 - 别依赖
shutil.move()的“原子性”——它底层在同分区是 rename,在跨分区是 copy+delete,失败点不同
最常被跳过的其实是测试环节:先用 print() 替代 shutil.move() 跑一遍,看输出的源/目标路径对不对;再选 3–5 个真实文件手动验证关键词是否命中。归类逻辑越简单,越要防路径和边界情况。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










