前言
每天下载的文件堆满桌面,.zip、.pdf、.jpg 混在一起,想找的时候翻半天。这件事其实完全可以交给脚本处理——今天我们就用 python 写一个桌面文件自动整理器,按文件类型自动分类到不同文件夹,全程无依赖、开箱即用。
这个脚本虽然只有 60 行代码,但涉及路径操作、正则匹配、日志记录三个实用技能,学会了可以扩展到任何批量文件处理场景。
主题介绍
我们要实现的功能:
- 扫描指定目录(默认桌面)的所有文件
- 根据文件扩展名将文件移动到对应的分类文件夹(文档、图片、视频、压缩包、代码等)
- 记录每次操作日志,方便回查
- 同名文件自动加后缀避免覆盖
核心思路:用 os 和 shutil 模块完成移动,用字典映射扩展名到分类,用 logging 记录轨迹。
环境准备
- python 3.8+(系统自带即可,无需第三方库)
- windows 桌面路径:
c:\users\用户名\desktop - macos 桌面路径:
~/desktop - linux 桌面路径:
~/desktop
创建项目目录结构:
mkdir ~/desktop-organizer cd ~/desktop-organizer touch organizer.py organize_log.json
实操步骤
步骤 1:定义分类规则
先建一个扩展名到文件夹名的映射字典。这是整个脚本的核心配置:
# 扩展名 → 目标文件夹名
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 = "其他"
步骤 2:编写整理逻辑
完整可执行脚本 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()
步骤 3:运行脚本
# 整理桌面(默认) python3 organizer.py # 整理指定目录 python3 organizer.py -- /path/to/messy/folder
运行后桌面会变成这样的结构:
desktop/
├── 文档/
│ ├── 简历.pdf
│ └── 笔记.md
├── 图片/
│ ├── 截图.png
│ └── 头像.jpg
├── 压缩包/
│ └── 素材包.zip
├── 代码/
│ └── app.js
└── 其他/
└── readme
步骤 4:表格对比 — 整理前后效果
| 维度 | 整理前 | 整理后 |
|---|---|---|
| 文件位置 | 全部混在桌面根目录 | 按类型分到子文件夹 |
| 查找速度 | 肉眼翻找,30 秒+ | 直接进对应文件夹 |
| 文件数量(示例) | 47 个文件平铺 | 5 个文件夹各装 1-20 个 |
| 重复文件风险 | 手动改名容易出错 | 脚本自动追加 _1, _2 后缀 |
| 可追溯性 | 无记录 | organize_log.json 记录每次操作 |
步骤 5:进阶 — 添加定时自动整理
方案 a:linux / macos 用 cron
# 每周一、四早上 9 点自动整理 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
知识扩展
python ai实现自动整理文件
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ai文件整理助手 - 自动分类桌面文件
作者:技术实战派
"""
import os
import shutil
from pathlib import path
from datetime import datetime
class aifileorganizer:
"""ai驱动的文件整理器"""
def __init__(self, source_dir, target_dir=none):
self.source_dir = path(source_dir)
self.target_dir = path(target_dir) if target_dir else self.source_dir / "已整理"
self.stats = {"moved": 0, "skipped": 0, "errors": 0}
# 定义分类规则
self.rules = {
"截图": {
"keywords": ["截图", "screen", "screencapture", "qq截图", "微信截图"],
"exts": [".png", ".jpg", ".jpeg"],
"folder": "图片/截图"
},
"合同文档": {
"keywords": ["合同", "协议", "agreement", "contract"],
"exts": [".pdf", ".doc", ".docx"],
"folder": "文档/合同"
},
"财务票据": {
"keywords": ["发票", "收据", "invoice", "receipt", "报销"],
"exts": [".pdf", ".png", ".jpg"],
"folder": "文档/财务"
},
"图片素材": {
"keywords": ["img", "image", "photo", "pic"],
"exts": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"],
"folder": "图片/素材"
},
"pdf文档": {
"exts": [".pdf"],
"folder": "文档/pdf"
},
"办公软件": {
"keywords": ["word", "excel", "ppt", "doc", "xls"],
"exts": [".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx"],
"folder": "文档/办公"
},
"压缩包": {
"exts": [".zip", ".rar", ".7z", ".tar", ".gz"],
"folder": "压缩包"
},
"安装包": {
"keywords": ["setup", "install", "installer"],
"exts": [".exe", ".msi", ".dmg", ".pkg"],
"folder": "软件/安装包"
},
"视频": {
"exts": [".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv"],
"folder": "视频"
},
"音频": {
"exts": [".mp3", ".wav", ".flac", ".aac", ".ogg"],
"folder": "音频"
},
"代码文件": {
"exts": [".py", ".js", ".html", ".css", ".java", ".cpp", ".c", ".go", ".rs"],
"folder": "代码"
}
}
def ai_classify(self, filename):
"""
ai智能分类:根据文件名和扩展名判断类型
"""
name_lower = filename.lower()
ext = path(filename).suffix.lower()
# 按优先级匹配规则
for category, rule in self.rules.items():
# 检查关键词
keywords = rule.get("keywords", [])
if any(kw.lower() in name_lower for kw in keywords):
return rule["folder"]
# 检查扩展名
exts = rule.get("exts", [])
if ext in exts:
return rule["folder"]
# 默认分类:按日期
return f"其他/{datetime.now().strftime('%y-%m')}"
def organize(self, dry_run=false):
"""
执行整理
:param dry_run: 试运行模式(只打印,不移动)
"""
print(f"📁 源目录: {self.source_dir}")
print(f"📂 目标目录: {self.target_dir}")
print(f"🔍 扫描文件中...\n")
# 遍历源目录
for item in self.source_dir.iterdir():
if item.is_dir():
continue # 跳过目录
filename = item.name
# 跳过脚本自身
if filename == os.path.basename(__file__):
continue
# ai分类
category = self.ai_classify(filename)
target_folder = self.target_dir / category
# 显示结果
action = "【模拟】" if dry_run else "【移动】"
print(f"{action} {filename:<30} → {category}")
if not dry_run:
try:
# 创建目标目录
target_folder.mkdir(parents=true, exist_ok=true)
# 处理重名文件
target_path = target_folder / filename
counter = 1
while target_path.exists():
stem = path(filename).stem
suffix = path(filename).suffix
target_path = target_folder / f"{stem}_{counter}{suffix}"
counter += 1
# 移动文件
shutil.move(str(item), str(target_path))
self.stats["moved"] += 1
except exception as e:
print(f" ❌ 错误: {e}")
self.stats["errors"] += 1
else:
self.stats["moved"] += 1
# 打印统计
print(f"\n{'='*50}")
print(f"📊 整理完成!")
print(f" 已处理: {self.stats['moved']} 个文件")
print(f" 错误: {self.stats['errors']} 个")
print(f"{'='*50}")
def main():
"""主函数"""
import argparse
parser = argparse.argumentparser(description='ai文件整理助手')
parser.add_argument('path', nargs='?', default='.', help='要整理的目录(默认当前目录)')
parser.add_argument('--output', '-o', help='输出目录(默认在源目录创建"已整理")')
parser.add_argument('--dry-run', '-d', action='store_true', help='试运行模式(不实际移动文件)')
args = parser.parse_args()
# 创建整理器
organizer = aifileorganizer(args.path, args.output)
# 执行整理
organizer.organize(dry_run=args.dry_run)
if __name__ == "__main__":
main()运行效果:
整理前:
桌面/
├── 微信截图_20260402123456.png
├── 合同-技术服务-v3.pdf
├── 发票-办公用品.jpg
├── setup_python_3.12.exe
├── project_backup.zip
├── 临时笔记.txt
└── ...
整理后:
已整理/
├── 图片/
│ └── 截图/
│ └── 微信截图_20260402123456.png
├── 文档/
│ ├── 合同/
│ │ └── 合同-技术服务-v3.pdf
│ └── 财务/
│ └── 发票-办公用品.jpg
├── 软件/
│ └── 安装包/
│ └── setup_python_3.12.exe
├── 压缩包/
│ └── project_backup.zip
└── 其他/
└── 2026-04/
└── 临时笔记.txt
总结
今天用 60 行 python 代码实现了一个桌面文件自动整理器,核心收获:
pathlib.path*比os.path更直观*—item.is_file()、item.suffix写起来更清晰- 同名处理是实战必须考虑的细节 — 加后缀
_1的逻辑虽然简单,但能避免真实场景中的数据丢失 - 日志记录是脚本工程的标配 — 有了日志,出问题能快速定位,也能做统计
这个脚本可以按自己需求扩展:比如加入"移动前先备份到 trash 目录"、“按创建时间分月归档”、“整合到 hermes 定时任务里每天自动跑”。
下一步可以试试给脚本加 cli 参数解析(argparse),让用户指定目标目录、开启 dry-run 预览模式,进一步工程化。
到此这篇关于基于python编写一个桌面文件自动整理工具的文章就介绍到这了,更多相关python桌面文件整理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论