查看: 379|回复: 3

Python实现桌面文件自动整理:60行脚本按扩展名分类

[复制链接]
发表于 昨天 10:00 | 显示全部楼层 |阅读模式
每天下载的文件堆满桌面,.zip、.pdf、.jpg 混在一起,想找的时候翻半天。这件事其实完全可以交给脚本处理——今天我们就用 Python 写一个桌面文件自动整理器,按文件类型自动分类到不同文件夹,全程无依赖、开箱即用。

这个脚本虽然只有 60 行代码,但涉及路径操作、字典映射、日志记录三个实用技能,学会了可以扩展到任何批量文件处理场景。

## 功能目标
- 扫描指定目录(默认桌面)的所有文件
- 根据文件扩展名将文件移动到对应的分类文件夹(文档、图片、视频、压缩包、代码等)
- 记录每次操作日志,方便回查
- 同名文件自动加后缀避免覆盖

核心思路:用 os 和 shutil 模块完成移动,用字典映射扩展名到分类,用 logging 记录轨迹。

## 环境要求
- Python 3.8+(系统自带即可,无需第三方库)
- 桌面路径(脚本自动识别):
  - Windows:C:\Users\用户名\Desktop
  - macOS/Linux:~/Desktop

项目目录结构建议:
  1. mkdir ~/desktop-organizer
  2. cd ~/desktop-organizer
  3. touch organizer.py organize_log.json
复制代码

## 分类规则定义
先建一个扩展名到文件夹名的映射字典,这是整个脚本的核心配置,可根据实际需求增删:
  1. CATEGORY_MAP = {
  2.     "pdf": "文档",
  3.     "doc": "文档", "docx": "文档", "txt": "文档", "md": "文档",
  4.     "jpg": "图片", "jpeg": "图片", "png": "图片", "gif": "图片",
  5.     "svg": "图片", "webp": "图片", "bmp": "图片",
  6.     "mp4": "视频", "mov": "视频", "avi": "视频", "mkv": "视频",
  7.     "mp3": "音频", "wav": "音频", "flac": "音频",
  8.     "zip": "压缩包", "rar": "压缩包", "7z": "压缩包", "tar.gz": "压缩包",
  9.     "py": "代码", "js": "代码", "html": "代码", "css": "代码",
  10.     "exe": "可执行", "dmg": "可执行", "deb": "可执行",
  11. }
  12. DEFAULT_CATEGORY = "其他"
复制代码

## 完整可执行脚本
创建 organizer.py,写入以下代码:
  1. #!/usr/bin/env python3
  2. """桌面文件自动整理工具"""
  3. import os
  4. import shutil
  5. import logging
  6. from pathlib import Path
  7. logging.basicConfig(
  8.     filename="organize_log.json",
  9.     level=logging.INFO,
  10.     format="%(asctime)s | %(message)s"
  11. )
  12. CATEGORY_MAP = {
  13.     "pdf": "文档", "doc": "文档", "docx": "文档", "txt": "文档", "md": "文档",
  14.     "jpg": "图片", "jpeg": "图片", "png": "图片", "gif": "图片",
  15.     "mp4": "视频", "mov": "视频", "mp3": "音频", "wav": "音频",
  16.     "zip": "压缩包", "rar": "压缩包", "7z": "压缩包",
  17.     "py": "代码", "js": "代码", "html": "代码",
  18. }
  19. DEFAULT_CATEGORY = "其他"
  20. def get_category(filename: str) -> str:
  21.     """根据文件名返回分类文件夹名"""
  22.     ext = Path(filename).suffix.lower().lstrip(".")
  23.     return CATEGORY_MAP.get(ext, DEFAULT_CATEGORY)
  24. def move_file(src: Path, dest_dir: Path) -> Path:
  25.     """移动文件,同名时自动加 _1, _2 后缀"""
  26.     dest_dir.mkdir(parents=True, exist_ok=True)
  27.     dest = dest_dir / src.name
  28.     if dest.exists():
  29.         stem, suffix = src.stem, src.suffix
  30.         counter = 1
  31.         while dest.exists():
  32.             dest = dest_dir / f"{stem}_{counter}{suffix}"
  33.             counter += 1
  34.     shutil.move(str(src), str(dest))
  35.     logging.info(f"移动: {src.name} -> {dest}")
  36.     return dest
  37. def organize(target_dir: str = None):
  38.     """扫描并整理目标目录"""
  39.     if target_dir is None:
  40.         target_dir = os.path.expanduser("~/Desktop")
  41.     root = Path(target_dir).resolve()
  42.     if not root.exists():
  43.         print(f"❌ 目录不存在: {root}")
  44.         return
  45.     count = 0
  46.     for item in root.iterdir():
  47.         if not item.is_file():
  48.             continue
  49.         if item.name.startswith("."):  # 跳过隐藏文件
  50.             continue
  51.         category = get_category(item.name)
  52.         dest_dir = root / category
  53.         move_file(item, dest_dir)
  54.         count += 1
  55.     print(f"✅ 完成,共整理 {count} 个文件")
  56.     logging.info(f"=== 本次整理 {count} 个文件 ===")
  57. if __name__ == "__main__":
  58.     organize()
复制代码

代码说明:
- get_category 使用 pathlib 获取后缀,转小写去掉点后查字典,不在字典中的归为“其他”
- move_file 处理同名:若目标已存在,则依次追加 _1、_2 等后缀直到不冲突
- organize 扫描指定目录(默认桌面),跳过隐藏文件和非文件项,对每个文件执行分类移动和日志记录
- 日志输出到同目录下的 organize_log.json,格式为“时间 | 移动: 文件名 -> 路径”

## 运行方式
整理桌面(默认):
  1. python3 organizer.py
复制代码
整理指定目录:
  1. python3 organizer.py -- /path/to/messy/folder
复制代码
注意:目前脚本中的 organize() 不接受命令行参数,如需支持可自行添加 sys.argv 解析;上述代码示例仅为演示逻辑,实际使用中可参考该思路扩展。

运行后桌面会变成如下结构:
  1. Desktop/
  2. ├── 文档/
  3. │   ├── 简历.pdf
  4. │   └── 笔记.md
  5. ├── 图片/
  6. │   ├── 截图.png
  7. │   └── 头像.jpg
  8. ├── 压缩包/
  9. │   └── 素材包.zip
  10. ├── 代码/
  11. │   └── app.js
  12. └── 其他/
  13.     └── README
复制代码

## 效果对比
整理前:所有文件混在桌面根目录,查找需肉眼翻找30秒以上,重复文件手动改名易错,无操作记录。
整理后:按类型分到子文件夹,直接进入对应文件夹秒查,同名文件自动加 _1/_2 后缀避免覆盖,所有操作记录在 organize_log.json 便于回溯。

## 进阶:定时自动整理
方案 A:Linux / macOS 使用 cron。每周一、四早上9点自动整理,crontab 添加:
  1. 0 9 * * 1,4 cd ~/desktop-organizer && python3 organizer.py
复制代码
方案 B:Windows 使用任务计划程序。创建基本任务,名称“桌面整理”,触发器选每周(周一和周四),操作启动程序 python.exe,参数填 organizer.py 的绝对路径。

方案 C:在脚本内加入防重复标记,避免同一天重复运行:
  1. MARKER_FILE = Path.home() / ".desktop_organize_done"
  2. def should_run() -> bool:
  3.     if MARKER_FILE.exists():
  4.         last_run = MARKER_FILE.stat().st_mtime
  5.         if (time.time() - last_run) < 86400:  # 24小时内
  6.             return False
  7.     return True
复制代码
在主函数开头调用 should_run() 决定是否执行整理。

## 总结
通过60行 Python 代码实现了一个实用的桌面文件整理工具,核心收获:
- pathlib.Path 比 os.path 更直观,item.is_file()、item.suffix 写起来清晰
- 同名处理是实战必须考虑的细节,加后缀 _1 的逻辑简单但能避免数据丢失
- 日志记录是脚本工程的标配,出问题可快速定位,也可做统计

该脚本可按需扩展:移动前先备份到 trash 目录、按创建时间分月归档、集成整合到定时任务里每天自动跑等。
回复

使用道具 举报

发表于 昨天 10:10 | 显示全部楼层

Re: Python实现桌面文件自动整理:60行脚本按扩展名分类

这个脚本太实用了!每天桌面确实容易乱,用代码自动分类比手动整理省心多了。我打算把它稍微改一下,增加一个“只移动特定扩展名之外的文件”的选项,方便过滤掉不想动的文件。另外问一下,如果文件夹名已经存在中文分类名(比如“文档”),脚本里直接用多级路径移动会不会有问题?还是说会自动创建?
回复 支持 反对

使用道具 举报

发表于 昨天 10:10 | 显示全部楼层

Re: Python实现桌面文件自动整理:60行脚本按扩展名分类

这个脚本写得真不错!60行就解决了桌面文件混乱的痛点,而且纯标准库实现,直接复制就能用,特别适合Python新手练手。分类映射字典的设计也很清晰,方便按需添加扩展名,灵活性很高。日志记录和重名处理这些小细节也考虑到了,看得出很实用。 如果想再完善一点,可以考虑增加递归扫描子目录的选项(比如桌面有些文件夹里也可能混合着文件),或者添加一个排除列表(比如不让脚本移动 `.lnk` 快捷方式或正在使用的文件)。另外,如果能支持按修改日期进一步子分类(比如“2025-03-文档”),对大文件量场景会更友好。 总之,这是一个很好的入门级自动化项目,感谢分享!
回复 支持 反对

使用道具 举报

发表于 昨天 10:10 | 显示全部楼层

Re: Python实现桌面文件自动整理:60行脚本按扩展名分类

这个脚本很实用,正好解决了我桌面文件混乱的痛点。字典映射分类的方式很清晰,以后添加新扩展名也方便。想问一下,如果想让它定期自动运行(比如每天执行一次),有没有什么推荐的做法?另外,能否通过命令行参数指定要整理的目录,而不是固定为桌面?谢谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-18 14:26 , Processed in 0.056055 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部