用 Python 自动整理文件、重命名、分类电脑文件夹

用 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 界面 :用 tkinterPyQt 包一层图形界面,给非技术同事用


六、总结

痛点 Python 解法
文件夹杂乱无章 organize_by_type() 按类型自动归位
文件名乱七八糟 batch_rename() 统一命名规范
照片越来越多 organize_by_date() 按年月归档
空文件夹残留 remove_empty_folders() 一键清理

核心就一句话:用 pathlib 操作路径,用 shutil 移动文件,用字典做分类映射。

相关推荐
CVer儿1 小时前
c++二级指针
开发语言·c++
极序时代GEO品牌优化2 小时前
杭州极序时代|面向地域、设备与用户画像的动态GEO
人工智能·python·算法·极序时代geo
mlidongfeng2 小时前
[AI][C++26] SIMD 编程模型思考
开发语言·c++·人工智能
j7~2 小时前
【Linux】二十七.线程篇四《Linux多线程编程:线程互斥(互斥量的底层到封装)、线程安全和冲入、死锁》---详解
linux·开发语言·c++·线程安全·死锁·线程互斥·重入
刘名喜2 小时前
第09篇-协程基础-Kotlin异步编程
开发语言·kotlin·springboot
其实防守也摸鱼2 小时前
HackBar 工具完全指南:信息探测、漏洞验证与安全测试实战
开发语言·人工智能·学习·安全·网络安全·安全威胁分析·安全性测试
qq_22589174662 小时前
基于Python的外卖订单数据分析可视化系统
python·信息可视化·django
MC皮蛋侠客2 小时前
SQLAlchemy 系列(三):声明式映射与 Schema——让类型、默认值和约束一致
数据库·python
会博通·代码搬运工2 小时前
会博通API对接实战:工程企业文档分布式采集系统的技术实现与Python SDK详解
开发语言·分布式·python·线性代数·矩阵·架构·电子档案合规