Python 入门实战:用标准库写一个下载文件夹自动归档工具

举报
yd_240997615 发表于 2026/10/22 02:37:16 2026/10/22
【摘要】 用 Python 标准库 pathlib 与 shutil 写一个按扩展名自动归档文件的实用工具:字典映射分类、重名自动加序号、常见避坑提示一应俱全,适合新手的第一个实战小项目,全程零第三方依赖。

为什么写这个工具

下载文件夹总是越堆越乱:安装包、图片、文档、压缩包混在一起,找文件全靠搜索。其实用 Python 标准库几十行代码,就能按扩展名把文件自动分门别类。本文适合刚学完 Python 基础语法、想做第一个小项目的同学,全程只用标准库,不用 pip 安装任何东西。

整体思路

  1. 用 pathlib 遍历目标文件夹里的文件;
  2. 按扩展名把文件映射到分类目录(图片、文档、压缩包、其他);
  3. 用 shutil.move 把文件移动过去,遇到重名自动加序号,避免覆盖;
  4. 只处理文件、跳过子目录,避免误伤。

完整代码

from pathlib import Path
import shutil

CATEGORIES = {
    "图片": {".jpg", ".png", ".gif", ".webp"},
    "文档": {".pdf", ".docx", ".md", ".txt"},
    "压缩包": {".zip", ".rar", ".7z"},
}

def target_dir(path: Path) -> str:
    for name, exts in CATEGORIES.items():
        if path.suffix.lower() in exts:
            return name
    return "其他"

def unique(dest: Path) -> Path:
    if not dest.exists():
        return dest
    i = 1
    while True:
        cand = dest.with_name(f"{dest.stem}_{i}{dest.suffix}")
        if not cand.exists():
            return cand
        i += 1

def organize(folder: str) -> None:
    root = Path(folder)
    for item in root.iterdir():
        if item.is_file():
            dest_dir = root / target_dir(item)
            dest_dir.mkdir(exist_ok=True)
            shutil.move(str(item), str(unique(dest_dir / item.name)))
            print("已归档:", item.name)

if __name__ == "__main__":
    organize(r"D:\Downloads")

几个容易踩的坑

  • Path.suffix 只能取最后一个扩展名,file.tar.gz 会被识别成 .gz,介意的话可以用 name.endswith 判断双扩展名;
  • 移动文件前要先确保目标分类目录存在,否则 shutil.move 可能把文件直接重命名成目录名;
  • 第一次运行前,先拿一个测试文件夹练手,确认逻辑无误后再对真实目录下手,文件操作没有后悔药;
  • Windows 路径记得用原始字符串,或者统一用正斜杠,避免转义字符惹麻烦。

小结

这个小工具用到的都是标准库:pathlib 负责路径处理,shutil 负责文件移动,代码量不大,但把字典映射、函数拆分、重名规避这些基本功都练到了。从语法学习走向实战,最快的方式就是解决自己日常的小麻烦。后续还可以给它加上日志记录、按月份分子目录、支持命令行参数等功能,留给大家动手练一练。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。