ARTICLE · 1123860
批量下载完混杂文件后,我用 Python 实现了全自动分类整理
引言:被混杂文件逼出来的自动化需求
上周要从云盘批量拉取一批学习资料和常用软件,跑完下载脚本后就先去忙别的,等想起来整理的时候打开下载文件夹直接傻眼:近百个文件堆在一个文件夹里,有几十MB的风水堪舆PDF、几百KB的紫微斗数讲义、还有世界经典文学的TXT,甚至混着一个169MB的Tor浏览器安装包,文件名要么是带出版社的长标题,要么是毫无意义的数字编号,手动分类花了二十多分钟还漏了好几个文件,当时就下定决心下次再也不手动整理了。
一、整理前先做「三校验」,避免白忙活
这次整理之前我先踩了个坑:之前跑下载脚本的时候,因为服务器后台进程被SIGTERM强杀,导致一部分文件没下完,一开始没注意,整理的时候才发现好几个PDF只有几MB,远低于正常大小。所以这次我先把校验环节放到了最前面:
先确认下载进程的退出状态:如果是正常退出(exit code 0)再继续,如果是被强杀(比如本次遇到的exit code -15,对应SIGTERM信号),先排查有没有漏下的文件; 排除下载时标记为「跳过」的项:比如这次下载里的「无链接: 小王子.txt」,因为没拿到有效下载链接根本没下载成功,直接过滤; 过滤无效文件:比如那个0KB的readme.txt,是下载脚本生成的占位文件,没有实际内容,直接跳过。
做完这三步之后,剩下的都是有效文件,再开始整理就不会做无用功。
二、双层匹配规则解决「同后缀不同分类」难题
一开始我试过单纯按文件后缀分类,把所有PDF扔到一个文件夹,所有DOC扔到另一个,结果整理完还是找不到文件——因为PDF里既有《风水宝鉴完整版》这类命理资料,也有《简爱》这类文学著作,同后缀的文件用途完全不同。
后来我改成了「后缀+文件名关键词」的双层匹配规则:先按后缀过滤掉明显不属于文档类的文件(比如DMG直接归为安装包),再对文档类文件匹配文件名里的特征关键词,比如包含「阳宅」「阴宅」「梅花易数」「紫微斗数」的归为「命理风水资料」,包含「简爱」「罗密欧与朱丽叶」「双城记」的归为「经典文学」,剩下的没有匹配关键词的文档归为「其他文档」。
这里举个实际的匹配案例:这次下载里的《郑轲梅花易数.pdf》和《简爱.txt》都是PDF/TXT后缀,单纯按后缀分会放到一起,但匹配到「梅花易数」关键词就自动归到了命理资料里,《简爱》匹配到文学关键词就归到了经典文学里,分类准确率直接拉满。
三、10行核心代码实现自动整理
整个整理逻辑用Python实现不到50行,核心的分类移动逻辑只有10行左右,先定义分类规则字典,再遍历所有有效文件,匹配规则后移动到对应目录,最后输出整理报告:
import os import re import shutil # 泛化后的下载目录,避免泄露具体路径 download_dir = "~/Downloads/hermes_batch" # 分类规则:关键词对应分类目录 category_rules = { "命理风水资料": ["阳宅", "阴宅", "风水", "梅花易数", "紫微斗数", "面相", "手相", "麻衣相法", "悟真篇", "河洛"], "经典文学": ["简爱", "罗密欧与朱丽叶", "双城记", "巴黎圣母院", "小王子"], "应用安装包": [".dmg", ".exe"], "其他文档": [] } # 遍历下载目录下的所有文件 for filename in os.listdir(download_dir): file_path = os.path.join(download_dir, filename) # 跳过目录和无效文件 if os.path.isdir(file_path) or os.path.getsize(file_path) == 0: continue # 先匹配后缀规则 ext = os.path.splitext(filename)[1].lower() for category, keywords in category_rules.items(): if ext in keywords: target_dir = os.path.join(download_dir, category) os.makedirs(target_dir, exist_ok=True) shutil.move(file_path, target_dir) break # 后缀没匹配到的话匹配文件名关键词 else: for category, keywords in category_rules.items(): if any(kw in filename for kw in keywords): target_dir = os.path.join(download_dir, category) os.makedirs(target_dir, exist_ok=True) shutil.move(file_path, target_dir) break else: # 都没匹配到归为其他 target_dir = os.path.join(download_dir, "其他文档") os.makedirs(target_dir, exist_ok=True) shutil.move(file_path, target_dir)
跑完之后不到1秒就把所有文件归位,最终整理出3个分类目录,总共整理了27个有效文件,跳过了2个无效文件,比手动整理快了几十倍。
结尾:可带走的三条效率经验
这次整理虽然是小场景,但总结出了三条通用的文件整理经验:
- 永远先校验再整理
:批量操作前先确认输入数据的有效性,过滤掉无效项,避免后续操作白费功夫; - 分类规则要贴合实际场景
:不要用通用的默认规则,比如这次如果只用后缀分类根本满足不了需求,结合业务特征(这里是文件名里的关键词)设计规则才是最高效的; - 小成本自动化投入产出比极高
:这种每次只需要10分钟但每周都要做的重复工作,花10分钟写个脚本就能一劳永逸,长期来看能省大量时间。
做自动化这几年,最耗时间的从来不是写代码,是摸清每个平台的脾气。
这篇里提到的坑,都是真金白银踩出来的。 如果这篇对你有用,点个关注,后面会继续更新自动化相关的实战记录; 有想省掉的重复活儿,也可以在后台留言。