专业服务 · 聪颖博客 —— 内容持续更新,欢迎指正。
技术分享成长记录工具推荐
在线咨询

Python 自动化清理下载文件夹

技术分享分类
3511字数
0阅读
8分钟

下载文件夹里有什么

我的下载文件夹常年处于“能看但不想打开”的状态。截图、安装包、PDF、压缩包、临时文件混在一起,文件名从“新建文档(7).docx”到“setup_final_v2(3).zip”应有尽有。每次找文件都得靠搜索,而搜索结果往往让人更绝望。

不是没想过手动整理,但整理一次要花十几分钟,隔两周又恢复原样。后来我决定写个 Python 脚本,让这件事自动化。要求很简单:每周跑一次,把文件按类型放进对应子文件夹,遇到正在下载的文件就跳过。

先定一个最小的规则

在写代码之前,得先想清楚“整理成什么样”。我给自己定了三条规则:

1. 只动下载文件夹里的文件,不碰子文件夹(因为子文件夹里可能已经是整理好的内容)。

2. 按扩展名分到固定的几个大类:图片、文档、压缩包、安装包、程序代码、其他。

3. 最近 3 天内的文件不动,避免把刚下载还没用上的东西移走。

这三条规则足够简单,但已经能满足大部分需求。如果以后遇到特殊文件,再往规则里加映射即可。

用 Python 实现

代码不需要花哨,用标准库就行。核心逻辑是遍历文件、判断类型、移动位置。

“`python

import shutil

import time

from pathlib import Path

DOWNLOAD_DIR = Path.home() / "Downloads"

KEEP_RECENT_SECONDS = 3 * 24 * 60 * 60

TYPE_MAP = {

"图片": [".jpg", ".jpeg", ".png", ".gif", ".svg", ".webp"],

"文档": [".pdf", ".docx", ".doc", ".txt", ".md", ".ppt", ".pptx", ".xlsx"],

"压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"],

"安装包": [".exe", ".msi", ".dmg", ".appimage", ".deb"],

"程序代码": [".py", ".js", ".ts", ".java", ".html", ".css", ".json", ".xml"],

}

def get_category(suffix: str) -> str:

for category, suffixes in TYPE_MAP.items():

if suffix.lower() in suffixes:

return category

return "其他"

def clean_downloads():

current_time = time.time()

for item in DOWNLOAD_DIR.iterdir():

if not item.is_file():

continue

# 跳过正在下载的文件(部分浏览器会生成 .crdownload / .part)

if item.suffix in {".crdownload", ".part"}:

continue

# 小于等于3天的文件暂时不处理

if current_time – item.stat().st_mtime <= KEEP_RECENT_SECONDS:

continue

category = get_category(item.suffix)

target_dir = DOWNLOAD_DIR / category

target_dir.mkdir(exist_ok=True)

target_path = target_dir / item.name

# 如果同名文件已存在,则在文件名后加序号

if target_path.exists():

stem = item.stem

suffix = item.suffix

counter = 1

while target_path.exists():

target_path = target_dir / f"{stem}_{counter}{suffix}"

counter += 1

shutil.move(str(item), str(target_path))

print(f"move {item.name} -> {category}/{target_path.name}")

“`

代码不复杂。用 `pathlib` 处理路径,用 `shutil.move` 移动文件。重名时加 `_1`、`_2` 这样的后缀,避免覆盖。`TYPE_MAP` 可以按自己需要增删,比如把 `.psd` 单独归到“设计文件”,完全随意。

让它定时运行

脚本本身只完成“手动执行一次”的任务,自动化还需要配合系统的定时任务。

  • Windows 上可以用“任务计划程序”,创建一个每周触发的任务,任务操作选择 `python.exe`,参数填脚本路径。
  • macOS 或 Linux 上可以写一个简单的 cron 表达式,比如 `0 9 * * 1 python3 /path/to/clean_downloads.py`,表示每周一早上 9 点运行。

如果不想用系统调度,也可以让脚本自己循环:在 `clean_downloads()` 外层加一个 `while True: sleep(3600)`,然后让它后台常驻。但这种方式会占用一个进程,反而不如系统定时任务干净。

几个可以改进的方向

脚本跑通之后,我发现“扩展名分组”只是整理的起点,实际使用中还有不少可以打磨的地方。

比如“其他”文件夹会慢慢积累一些奇怪的文件,这时候可以定期打开看看,该留的留,该删的删。而真正判断文件有没有用,靠自动化做不到。脚本能做的是减少文件堆积起来之后的无从下手感,但定期清理“其他”文件夹仍然需要人工介入。

如果你愿意更进一步,可以把脚本改成读取一个 `rules.yaml` 配置文件,把“图片”“文档”这类归类逻辑从代码中剥离,哪天想改规则,不用再打开源文件。或者加入一个“undo”功能,把移动过的路径记录到日志里,万一整理错了一个文件,还能手动找回来。

另外一个容易被忽略的点:不同操作系统的权限问题。如果下载文件夹里有某些文件从别的设备同步过来,可能带 `只读` 或 `锁定` 属性,移动前可以先尝试修改权限,或者至少捕获 `PermissionError` 把失败的文件名打印出来,避免脚本中途崩溃。

让清理回归简单

前前后后我花了一个小时写这个脚本,之后每周它自动运行一次。下载文件夹不再是看一眼就头疼的地方,而是一个“最多三天内的文件出现在表面,更旧的文件按类型安静待着”的空间。偶尔需要找一份一周前的合同,直接进“文档”文件夹就行,不用再用系统搜索。

如果你也经常被下载文件夹整得没脾气,可以试着从这一个小脚本开始。先定义最简单的规则,再慢慢加需求。自动化不是为了把简单的事情变复杂,而是把重复的事情变稳定。

泰州市喃彰坪鞋帽批发有限公司 苏ICP备2026071437号-3