用 Python 自动整理文件、重命名、分类电脑文件夹
告别混乱的桌面和下载文件夹,几行 Python 代码让一切井井有条。
一、为什么需要自动整理?
每个人大概都有过这样的经历:
-
下载文件夹里堆了 3000 个文件,找东西靠肉眼翻;
-
桌面塞满截图、文档、安装包,像一块"数字垃圾场";
-
想批量把照片按
IMG_001.jpg改成旅行_2026_001.jpg,手动改到崩溃。
手动整理费时费力还容易出错,而 Python 脚本可以 10 秒搞定 10000 个文件。
二、核心思路
整个整理流程拆成 3 个独立模块,像搭积木一样组合使用:
| 功能 | 原理 | 适用场景 |
|---|---|---|
| 按类型分类 | 读取文件扩展名 → 匹配分类字典 → 移入对应子文件夹 | 下载文件夹、桌面杂乱 |
| 批量重命名 | 遍历文件 → 按模板生成新名字 → 原子重命名 | 照片归档、项目文件规范化 |
| 按日期归档 | 读取文件修改时间 → 创建 年/月 目录 → 移入 |
照片库、日志文件、截图 |
三、完整代码
以下是可直接运行的完整脚本,复制到本地 .py 文件即可使用:
"""
Python 自动整理文件工具
功能:按文件类型自动分类 + 批量重命名 + 按日期归档 + 清理空文件夹
"""
import os
import shutil
from datetime import datetime
from pathlib import Path
from collections import defaultdict
# ============================================================
# 1. 文件分类规则(可按需要扩展)
# ============================================================
CATEGORY_MAP = {
"图片": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg", ".ico", ".tiff", ".psd"],
"文档": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".txt", ".md", ".csv"],
"视频": [".mp4", ".avi", ".mov", ".mkv", ".flv", ".wmv", ".webm"],
"音频": [".mp3", ".wav", ".flac", ".aac", ".ogg", ".m4a"],
"压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"],
"安装包": [".exe", ".msi", ".dmg", ".deb"],
"代码": [".py", ".js", ".ts", ".java", ".c", ".cpp", ".go", ".rs", ".html", ".css", ".json"],
"字体": [".ttf", ".otf", ".woff", ".woff2"],
}
def get_category(extension: str) -> str:
ext = extension.lower()
for category, extensions in CATEGORY_MAP.items():
if ext in extensions:
return category
return "其他"
# ============================================================
# 2. 按文件类型自动分类
# ============================================================
def organize_by_type(folder_path: str, dry_run: bool = False) -> dict:
folder = Path(folder_path)
if not folder.is_dir():
raise NotADirectoryError(f"路径不存在或不是文件夹: {folder_path}")
stats = defaultdict(int)
for item in folder.iterdir():
if item.is_dir() or item.name.startswith("."):
continue
category = get_category(item.suffix)
target_dir = folder / category
stats[category] += 1
if dry_run:
print(f" [预览] {item.name} → {category}/")
else:
target_dir.mkdir(exist_ok=True)
shutil.move(str(item), str(target_dir / item.name))
print(f" ✅ {item.name} → {category}/")
print(f"\n📊 统计: {dict(stats)}")
return dict(stats)
# ============================================================
# 3. 批量重命名
# ============================================================
def batch_rename(
folder_path: str,
pattern: str = "file_{counter:03d}",
prefix: str = "",
add_date: bool = False,
dry_run: bool = False,
):
folder = Path(folder_path)
counter = 1
for item in sorted(folder.iterdir()):
if item.is_dir() or item.name.startswith("."):
continue
date_str = datetime.now().strftime("%Y%m%d") if add_date else ""
new_name = pattern.format(counter=counter, name=item.stem, ext=item.suffix)
if prefix:
new_name = f"{prefix}_{new_name}"
if date_str:
new_name = f"{date_str}_{new_name}"
if not Path(new_name).suffix:
new_name += item.suffix
if dry_run:
print(f" [预览] {item.name} → {new_name}")
else:
item.rename(folder / new_name)
print(f" ✅ {item.name} → {new_name}")
counter += 1
# ============================================================
# 4. 按日期归档(适合照片/截图)
# ============================================================
def organize_by_date(folder_path: str, dry_run: bool = False):
folder = Path(folder_path)
for item in folder.iterdir():
if item.is_dir() or item.name.startswith("."):
continue
mtime = datetime.fromtimestamp(item.stat().st_mtime)
year_dir = folder / str(mtime.year)
month_dir = year_dir / f"{mtime.month:02d}"
if not dry_run:
month_dir.mkdir(parents=True, exist_ok=True)
shutil.move(str(item), str(month_dir / item.name))
print(f" {'✅' if not dry_run else '[预览]'} {item.name} → {mtime.year}/{mtime.month:02d}/")
# ============================================================
# 5. 清理空文件夹
# ============================================================
def remove_empty_folders(folder_path: str, dry_run: bool = False):
folder = Path(folder_path)
removed = 0
for root, dirs, files in os.walk(folder, topdown=False):
for d in dirs:
full = Path(root) / d
try:
if not any(full.iterdir()):
if not dry_run:
full.rmdir()
removed += 1
print(f" 🗑️ {'将删除' if dry_run else '已删除'}: {full}")
except (OSError, PermissionError):
pass
print(f"\n共{'将' if dry_run else ''}删除 {removed} 个空文件夹")
# ============================================================
# 6. 一键整理入口
# ============================================================
def auto_organize(folder_path: str, dry_run: bool = True):
print(f"\n{'='*50}\n📁 目标文件夹: {folder_path}\n{'='*50}\n")
print("📂 [Step 1] 按文件类型分类")
organize_by_type(folder_path, dry_run=dry_run)
print("\n🧹 [Step 2] 清理空文件夹")
remove_empty_folders(folder_path, dry_run=dry_run)
if dry_run:
print("\n⚠️ 以上为预览模式,未做实际修改。确认后设 dry_run=False。")
# ============================================================
# 使用示例
# ============================================================
if __name__ == "__main__":
TARGET_FOLDER = r"D:\Downloads" # ← 改成你的路径
auto_organize(TARGET_FOLDER, dry_run=True) # 先预览
# auto_organize(TARGET_FOLDER, dry_run=False) # 确认后执行
四、使用指南
Step 1:修改目标路径
# Windows
TARGET_FOLDER = r"D:\Downloads"
# macOS
TARGET_FOLDER = "/Users/yourname/Desktop"
# Linux
TARGET_FOLDER = "/home/yourname/Documents"
💡 Windows 路径前面加
r,避免反斜杠被当成转义符。
Step 2:先预览,再执行
脚本默认 dry_run=True,只会打印"将要做什么",不会动你的文件:
[预览] photo1.jpg → 图片/
[预览] report.pdf → 文档/
[预览] movie.mp4 → 视频/
确认无误后,把 dry_run 改为 False,真正执行。
Step 3:单独调用某个功能
# 只做批量重命名(加前缀 + 日期)
batch_rename(TARGET_FOLDER, pattern="photo_{counter:03d}", prefix="东京旅行", add_date=True)
# 只按日期归档照片
organize_by_date(TARGET_FOLDER)
# 只清理空文件夹
remove_empty_folders(TARGET_FOLDER)
五、实用技巧
🔒 安全第一
| 建议 | 说明 |
|---|---|
| 先 dry_run | 永远先预览再执行,确认分类规则符合预期 |
| 备份重要文件 | 首次在重要文件夹上运行时,先复制一份 |
| 排除系统文件 | 脚本已自动跳过 . 开头的隐藏文件 |
🎨 自定义分类规则
在 CATEGORY_MAP 字典里添加或修改即可:
CATEGORY_MAP = {
"电子书": [".epub", ".mobi", ".azw3", ".pdf"],
"设计素材": [".psd", ".ai", ".sketch", ".fig", ".xd"],
"虚拟机": [".vmdk", ".vdi", ".qcow2", ".ova"],
}
⏰ 设置定时自动整理
结合 Windows 任务计划程序 / macOS cron / Linux crontab,每周自动跑一次:
# crontab 示例:每周日凌晨 3 点自动整理下载文件夹
0 3 * * 0 /usr/bin/python3 /path/to/organize.py
🚀 进阶玩法
-
按文件大小分类:大文件单独归档到移动硬盘目录
-
去重 :用
hashlib计算 MD5,自动删除重复文件 -
智能识别 :结合
python-magic库,不依赖扩展名也能识别文件类型 -
GUI 界面 :用
tkinter或PyQt包一层图形界面,给非技术同事用
六、总结
| 痛点 | Python 解法 |
|---|---|
| 文件夹杂乱无章 | organize_by_type() 按类型自动归位 |
| 文件名乱七八糟 | batch_rename() 统一命名规范 |
| 照片越来越多 | organize_by_date() 按年月归档 |
| 空文件夹残留 | remove_empty_folders() 一键清理 |
核心就一句话:用 pathlib 操作路径,用 shutil 移动文件,用字典做分类映射。