用 pathlib 与 argparse 写一个可复用的 Python 文件整理小工具

举报
温华9527 发表于 2026/10/29 09:23:53 2026/10/29
【摘要】 用 Python 的 pathlib 与 argparse 写一个按类型整理文件的小工具:规则清晰、重名不覆盖、先预览再移动,附可直接运行的代码与扩展方向。

下载文件夹是不是经常变成一个“什么都有”的大杂烩?截图、安装包、表格、压缩包混在一起,找一个文件要翻很久。手动整理一次不难,难的是坚持。我的做法是写一个只有一百多行的小脚本,每周运行一次,让规则代替耐心。本文用 Python 的 pathlib 和 argparse 实现它,思路简单,也方便以后扩展。

先定规则,再写代码

整理的第一步不是写代码,而是把规则写清楚。这个小工具只做三件事:按扩展名把文件分到不同文件夹,遇到重名文件不覆盖,运行前可以先预览。规则越简单,误伤的可能就越小。

我用的分类表是这样的:图片放 Images,文档放 Documents,表格和演示文稿放 Documents,压缩包放 Archives,安装包放 Installers,其他类型先放 Others,不直接删除。这样即使分类不完美,文件也还在,只是换了一个位置。

核心代码

from pathlib import Path
import argparse, shutil

RULES = {
    ".jpg": "Images", ".png": "Images", ".pdf": "Documents",
    ".docx": "Documents", ".xlsx": "Documents", ".zip": "Archives",
    ".exe": "Installers", ".dmg": "Installers",
}

def unique_path(target: Path) -> Path:
    if not target.exists():
        return target
    i = 1
    while True:
        new_name = f"{target.stem}_{i}{target.suffix}"
        candidate = target.with_name(new_name)
        if not candidate.exists():
            return candidate
        i += 1

def main():
    parser = argparse.ArgumentParser(description="按类型整理文件夹")
    parser.add_argument("source", help="要整理的目录")
    parser.add_argument("--dry-run", action="store_true", help="只预览,不移动")
    args = parser.parse_args()
    source = Path(args.source).expanduser()
    for item in source.iterdir():
        if not item.is_file() or item.name.startswith("."):
            continue
        folder = RULES.get(item.suffix.lower(), "Others")
        dest = unique_path(source / folder / item.name)
        if args.dry_run:
            print(f"{item.name} -> {folder}/")
        else:
            dest.parent.mkdir(parents=True, exist_ok=True)
            shutil.move(str(item), str(dest))

if __name__ == "__main__":
    main()

这里有几个值得注意的细节。第一,用 Path 而不是字符串拼接路径,跨平台更稳,也不用操心斜杠方向。第二,unique_path 在重名时自动加序号,避免新文件把旧文件覆盖掉。第三,隐藏文件直接跳过,防止误动系统或应用的配置文件。

先预览,再真正移动

批量移动文件最怕“手一抖”。所以 dry-run 是这个工具最重要的功能。先运行预览,确认每一行的去向都合理,再去掉参数真正执行。

python tidy.py ~/Downloads --dry-run
python tidy.py ~/Downloads

我还建议第一次只对一个专门的测试目录运行,里面放几个复制出来的文件。确认无误后,再用在真实的下载目录上。已经整理过的文件夹不要反复运行,因为脚本只处理源目录顶层的文件,不会递归进已经分好的子文件夹。

可以继续扩展的方向

这个骨架很容易扩展:如果分类表越来越长,可以把它抽到一个 JSON 配置文件里;如果想按日期再分一层,可以用文件的修改时间生成“年-月”子目录;如果经常忘记运行,可以用系统定时任务每周执行一次。扩展时保持一个原则:每加一个功能,就先想清楚它会不会误删或覆盖文件。

小工具的价值不在于代码多复杂,而在于规则清晰、可预览、可回退。先把下载文件夹的混乱收拾好,再把时间留给真正的工作,这就是它存在的意义。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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