基于Python编写一个桌面文件自动整理工具

 更新时间:2026年08月10日 11:47:43   作者:EricZhengX  
这篇文章主要介绍了如何使用Python写一个自动整理脚本,60行代码按文件类型自动归类,支持文档、图片、视频等,还能防止重名覆盖,操作简单,无需额外库,附定时运行技巧,让桌面永远整洁

前言

每天下载的文件堆满桌面,.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桌面文件整理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何利用pandas工具输出每行的索引值、及其对应的行数据

    如何利用pandas工具输出每行的索引值、及其对应的行数据

    这篇文章主要介绍了如何利用pandas工具输出每行的索引值、及其对应的行数据,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Python3爬虫使用Fidder实现APP爬取示例

    Python3爬虫使用Fidder实现APP爬取示例

    这篇文章主要介绍了Python3爬虫使用Fidder实现APP爬取示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • python通过Seq2Seq实现闲聊机器人

    python通过Seq2Seq实现闲聊机器人

    这篇文章主要介绍了python通过Seq2Seq实现闲聊机器人,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • Python使用execjs执行包含中文参数的JavaScript

    Python使用execjs执行包含中文参数的JavaScript

    爬虫的开发过程中,往往需要对JS进行模拟,简单或者通用的还可以在Python中模拟或者找到对应的第三方库,但是复杂的就可能不好实现了,下面这篇文章主要给大家介绍了关于Python使用execjs执行包含中文参数的JavaScript的相关资料,需要的朋友可以参考下
    2022-03-03
  • 基于FastAPI与LangChain开发Excel智能数据分析API详解

    基于FastAPI与LangChain开发Excel智能数据分析API详解

    本文将详细介绍如何使用FastAPI和LangChain构建一个支持流式响应的Excel智能数据分析API,实现对结构化数据的自然语言查询与对话式分析,需要的可以了解下
    2025-10-10
  • Python 列表排序详解

    Python 列表排序详解

    这篇文章主要介绍了Python中对列表排序实例,本文给出了9个List的排序实例,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • Python入门教程之if语句的用法

    Python入门教程之if语句的用法

    这篇文章主要介绍了Python入门教程之if语句的用法,是Python入门的基础知识,需要的朋友可以参考下
    2015-05-05
  • Python数据清洗之利用pandas筛选数据详解

    Python数据清洗之利用pandas筛选数据详解

    这篇文章主要介绍了Python数据清洗之利用pandas筛选数据详解,Pandas是一个用于数据分析和处理的Python库,它提供了高效的数据结构和数据分析工具,使得数据的清洗、转换、分析和可视化变得更加容易和灵活,需要的朋友可以参考下
    2023-08-08
  • 非递归的输出1-N的全排列实例(推荐)

    非递归的输出1-N的全排列实例(推荐)

    下面小编就为大家带来一篇非递归的输出1-N的全排列实例(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Python执行系统命令的所有方法实践教学

    Python执行系统命令的所有方法实践教学

    在Python中,执行系统命令主要涉及os、subprocess和shutil模块 ,本文将详细对比Python中执行系统命令的不同方法及其适用场景,推荐使用subprocess.run()作为现代Python脚本的标准选择
    2026-07-07

最新评论