每天下载的文件堆满桌面,.zip、.pdf、.jpg 混在一起,想找的时候翻半天。这件事其实完全可以交给脚本处理——今天我们就用 Python 写一个桌面文件自动整理器,按文件类型自动分类到不同文件夹,全程无依赖、开箱即用。
这个脚本虽然只有 60 行代码,但涉及路径操作、字典映射、日志记录三个实用技能,学会了可以扩展到任何批量文件处理场景。
## 功能目标
- 扫描指定目录(默认桌面)的所有文件
- 根据文件扩展名将文件移动到对应的分类文件夹(文档、图片、视频、压缩包、代码等)
- 记录每次操作日志,方便回查
- 同名文件自动加后缀避免覆盖
核心思路:用 os 和 shutil 模块完成移动,用字典映射扩展名到分类,用 logging 记录轨迹。
## 环境要求
- Python 3.8+(系统自带即可,无需第三方库)
- 桌面路径(脚本自动识别):
- Windows:C:\Users\用户名\Desktop
- macOS/Linux:~/Desktop
项目目录结构建议:- mkdir ~/desktop-organizer
- cd ~/desktop-organizer
- touch organizer.py organize_log.json
复制代码
## 分类规则定义
先建一个扩展名到文件夹名的映射字典,这是整个脚本的核心配置,可根据实际需求增删:- CATEGORY_MAP = {
- "pdf": "文档",
- "doc": "文档", "docx": "文档", "txt": "文档", "md": "文档",
- "jpg": "图片", "jpeg": "图片", "png": "图片", "gif": "图片",
- "svg": "图片", "webp": "图片", "bmp": "图片",
- "mp4": "视频", "mov": "视频", "avi": "视频", "mkv": "视频",
- "mp3": "音频", "wav": "音频", "flac": "音频",
- "zip": "压缩包", "rar": "压缩包", "7z": "压缩包", "tar.gz": "压缩包",
- "py": "代码", "js": "代码", "html": "代码", "css": "代码",
- "exe": "可执行", "dmg": "可执行", "deb": "可执行",
- }
- DEFAULT_CATEGORY = "其他"
复制代码
## 完整可执行脚本
创建 organizer.py,写入以下代码:- #!/usr/bin/env python3
- """桌面文件自动整理工具"""
- import os
- import shutil
- import logging
- from pathlib import Path
- logging.basicConfig(
- filename="organize_log.json",
- level=logging.INFO,
- format="%(asctime)s | %(message)s"
- )
- CATEGORY_MAP = {
- "pdf": "文档", "doc": "文档", "docx": "文档", "txt": "文档", "md": "文档",
- "jpg": "图片", "jpeg": "图片", "png": "图片", "gif": "图片",
- "mp4": "视频", "mov": "视频", "mp3": "音频", "wav": "音频",
- "zip": "压缩包", "rar": "压缩包", "7z": "压缩包",
- "py": "代码", "js": "代码", "html": "代码",
- }
- DEFAULT_CATEGORY = "其他"
- def get_category(filename: str) -> str:
- """根据文件名返回分类文件夹名"""
- ext = Path(filename).suffix.lower().lstrip(".")
- return CATEGORY_MAP.get(ext, DEFAULT_CATEGORY)
- def move_file(src: Path, dest_dir: Path) -> Path:
- """移动文件,同名时自动加 _1, _2 后缀"""
- dest_dir.mkdir(parents=True, exist_ok=True)
- dest = dest_dir / src.name
- if dest.exists():
- stem, suffix = src.stem, src.suffix
- counter = 1
- while dest.exists():
- dest = dest_dir / f"{stem}_{counter}{suffix}"
- counter += 1
- shutil.move(str(src), str(dest))
- logging.info(f"移动: {src.name} -> {dest}")
- return dest
- def organize(target_dir: str = None):
- """扫描并整理目标目录"""
- if target_dir is None:
- target_dir = os.path.expanduser("~/Desktop")
- root = Path(target_dir).resolve()
- if not root.exists():
- print(f"❌ 目录不存在: {root}")
- return
- count = 0
- for item in root.iterdir():
- if not item.is_file():
- continue
- if item.name.startswith("."): # 跳过隐藏文件
- continue
- category = get_category(item.name)
- dest_dir = root / category
- move_file(item, dest_dir)
- count += 1
- print(f"✅ 完成,共整理 {count} 个文件")
- logging.info(f"=== 本次整理 {count} 个文件 ===")
- if __name__ == "__main__":
- organize()
复制代码
代码说明:
- get_category 使用 pathlib 获取后缀,转小写去掉点后查字典,不在字典中的归为“其他”
- move_file 处理同名:若目标已存在,则依次追加 _1、_2 等后缀直到不冲突
- organize 扫描指定目录(默认桌面),跳过隐藏文件和非文件项,对每个文件执行分类移动和日志记录
- 日志输出到同目录下的 organize_log.json,格式为“时间 | 移动: 文件名 -> 路径”
## 运行方式
整理桌面(默认):整理指定目录:- python3 organizer.py -- /path/to/messy/folder
复制代码 注意:目前脚本中的 organize() 不接受命令行参数,如需支持可自行添加 sys.argv 解析;上述代码示例仅为演示逻辑,实际使用中可参考该思路扩展。
运行后桌面会变成如下结构:- Desktop/
- ├── 文档/
- │ ├── 简历.pdf
- │ └── 笔记.md
- ├── 图片/
- │ ├── 截图.png
- │ └── 头像.jpg
- ├── 压缩包/
- │ └── 素材包.zip
- ├── 代码/
- │ └── app.js
- └── 其他/
- └── README
复制代码
## 效果对比
整理前:所有文件混在桌面根目录,查找需肉眼翻找30秒以上,重复文件手动改名易错,无操作记录。
整理后:按类型分到子文件夹,直接进入对应文件夹秒查,同名文件自动加 _1/_2 后缀避免覆盖,所有操作记录在 organize_log.json 便于回溯。
## 进阶:定时自动整理
方案 A:Linux / macOS 使用 cron。每周一、四早上9点自动整理,crontab 添加:- 0 9 * * 1,4 cd ~/desktop-organizer && python3 organizer.py
复制代码 方案 B:Windows 使用任务计划程序。创建基本任务,名称“桌面整理”,触发器选每周(周一和周四),操作启动程序 python.exe,参数填 organizer.py 的绝对路径。
方案 C:在脚本内加入防重复标记,避免同一天重复运行:- MARKER_FILE = Path.home() / ".desktop_organize_done"
- def should_run() -> bool:
- if MARKER_FILE.exists():
- last_run = MARKER_FILE.stat().st_mtime
- if (time.time() - last_run) < 86400: # 24小时内
- return False
- return True
复制代码 在主函数开头调用 should_run() 决定是否执行整理。
## 总结
通过60行 Python 代码实现了一个实用的桌面文件整理工具,核心收获:
- pathlib.Path 比 os.path 更直观,item.is_file()、item.suffix 写起来清晰
- 同名处理是实战必须考虑的细节,加后缀 _1 的逻辑简单但能避免数据丢失
- 日志记录是脚本工程的标配,出问题可快速定位,也可做统计
该脚本可按需扩展:移动前先备份到 trash 目录、按创建时间分月归档、集成整合到定时任务里每天自动跑等。 |