批量下载完混杂文件后,我用 Python 实现了全自动分类整理

引言:被混杂文件逼出来的自动化需求

上周要从云盘批量拉取一批学习资料和常用软件,跑完下载脚本后就先去忙别的,等想起来整理的时候打开下载文件夹直接傻眼:近百个文件堆在一个文件夹里,有几十MB的风水堪舆PDF、几百KB的紫微斗数讲义、还有世界经典文学的TXT,甚至混着一个169MB的Tor浏览器安装包,文件名要么是带出版社的长标题,要么是毫无意义的数字编号,手动分类花了二十多分钟还漏了好几个文件,当时就下定决心下次再也不手动整理了。

一、整理前先做「三校验」,避免白忙活

这次整理之前我先踩了个坑:之前跑下载脚本的时候,因为服务器后台进程被SIGTERM强杀,导致一部分文件没下完,一开始没注意,整理的时候才发现好几个PDF只有几MB,远低于正常大小。所以这次我先把校验环节放到了最前面:

  1. 先确认下载进程的退出状态:如果是正常退出(exit code 0)再继续,如果是被强杀(比如本次遇到的exit code -15,对应SIGTERM信号),先排查有没有漏下的文件;
  2. 排除下载时标记为「跳过」的项:比如这次下载里的「无链接: 小王子.txt」,因为没拿到有效下载链接根本没下载成功,直接过滤;
  3. 过滤无效文件:比如那个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个无效文件,比手动整理快了几十倍。

结尾:可带走的三条效率经验

这次整理虽然是小场景,但总结出了三条通用的文件整理经验:

  1. 永远先校验再整理:批量操作前先确认输入数据的有效性,过滤掉无效项,避免后续操作白费功夫;
  2. 分类规则要贴合实际场景:不要用通用的默认规则,比如这次如果只用后缀分类根本满足不了需求,结合业务特征(这里是文件名里的关键词)设计规则才是最高效的;
  3. 小成本自动化投入产出比极高:这种每次只需要10分钟但每周都要做的重复工作,花10分钟写个脚本就能一劳永逸,长期来看能省大量时间。
posted @ 2026-08-29 09:44  钱栈up  阅读(6)  评论(0)    收藏  举报