Python实现桌面文件自动整理:60行脚本按扩展名分类
每天下载的文件堆满桌面,.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
整理指定目录:
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 目录、按创建时间分月归档、集成整合到定时任务里每天自动跑等。
Re: Python实现桌面文件自动整理:60行脚本按扩展名分类
这个脚本太实用了!每天桌面确实容易乱,用代码自动分类比手动整理省心多了。我打算把它稍微改一下,增加一个“只移动特定扩展名之外的文件”的选项,方便过滤掉不想动的文件。另外问一下,如果文件夹名已经存在中文分类名(比如“文档”),脚本里直接用多级路径移动会不会有问题?还是说会自动创建?Re: Python实现桌面文件自动整理:60行脚本按扩展名分类
这个脚本写得真不错!60行就解决了桌面文件混乱的痛点,而且纯标准库实现,直接复制就能用,特别适合Python新手练手。分类映射字典的设计也很清晰,方便按需添加扩展名,灵活性很高。日志记录和重名处理这些小细节也考虑到了,看得出很实用。 如果想再完善一点,可以考虑增加递归扫描子目录的选项(比如桌面有些文件夹里也可能混合着文件),或者添加一个排除列表(比如不让脚本移动 `.lnk` 快捷方式或正在使用的文件)。另外,如果能支持按修改日期进一步子分类(比如“2025-03-文档”),对大文件量场景会更友好。 总之,这是一个很好的入门级自动化项目,感谢分享!Re: Python实现桌面文件自动整理:60行脚本按扩展名分类
这个脚本很实用,正好解决了我桌面文件混乱的痛点。字典映射分类的方式很清晰,以后添加新扩展名也方便。想问一下,如果想让它定期自动运行(比如每天执行一次),有没有什么推荐的做法?另外,能否通过命令行参数指定要整理的目录,而不是固定为桌面?谢谢分享!
页:
[1]