折腾侠
项目实战

用 Python 自动整理下载文件夹 - 实战小项目

手把手教你用 Python 编写自动文件整理脚本,告别混乱的下载文件夹,适合新手练手的实用项目。

折腾侠
2026/03/15 发布
15约 6 分钟1067 字 / 728 词00

用 Python 自动整理下载文件夹 - 实战小项目

你的下载文件夹是不是也乱成一团糟?本教程带你用 Python 写一个自动整理脚本,让文件各归其位。适合新手练手的实用项目!

🎯 项目目标

编写一个 Python 脚本,自动将下载文件夹中的文件按类型移动到对应文件夹:

下载文件夹/
├── 图片/
│   ├── photo.jpg
│   └── screenshot.png
├── 文档/
│   ├── resume.pdf
│   └── notes.docx
├── 视频/
│   └── tutorial.mp4
├── 音频/
│   └── music.mp3
├── 压缩包/
│   └── archive.zip
└── 其他/
    └── unknown.xyz

📋 前置要求

  • Python 3.6+
  • 基础 Python 语法知识
  • 一个混乱的下载文件夹 😅

🛠️ 第一步:环境准备

检查 Python 版本

Bash
python --version
# 或
python3 --version

创建项目文件夹

Bash
# 创建项目目录
mkdir file-organizer
cd file-organizer

# 创建虚拟环境(推荐)
python -m venv venv

# 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate

创建项目结构

Bash
# 创建必要的文件
touch organizer.py
touch config.py
touch README.md

# 创建目标文件夹
mkdir -p 图片 文档 视频 音频 压缩包 其他

📝 第二步:编写配置文件

创建 INLINE_CODE_0,定义文件类型映射:

Python
# config.py

# 文件扩展名到文件夹的映射
FILE_CATEGORIES = {
    '图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp', '.ico'],
    '文档': ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', 
             '.txt', '.md', '.rtf', '.odt', '.ods'],
    '视频': ['.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv', '.webm'],
    '音频': ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.wma'],
    '压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz', '.bz2'],
    '代码': ['.py', '.js', '.html', '.css', '.java', '.cpp', '.c', '.h'],
    '安装包': ['.exe', '.dmg', '.pkg', '.deb', '.rpm'],
}

# 默认文件夹(无法分类的文件)
DEFAULT_FOLDER = '其他'

# 下载文件夹路径(可以修改)
DOWNLOAD_FOLDER = '~/Downloads'

🔧 第三步:编写核心逻辑

创建 INLINE_CODE_1

Python
# organizer.py

import os
import shutil
from pathlib import Path
from config import FILE_CATEGORIES, DEFAULT_FOLDER, DOWNLOAD_FOLDER


class FileOrganizer:
    """文件整理器"""
    
    def __init__(self, download_path=None):
        """初始化整理器
        
        Args:
            download_path: 下载文件夹路径,默认使用配置文件中的路径
        """
        if download_path:
            self.download_folder = Path(download_path)
        else:
            self.download_folder = Path(DOWNLOAD_FOLDER).expanduser()
        
        # 验证路径存在
        if not self.download_folder.exists():
            raise FileNotFoundError(f"下载文件夹不存在:{self.download_folder}")
        
        print(f"📁 整理目标:{self.download_folder}")
    
    def get_category(self, filename):
        """根据文件名判断类别
        
        Args:
            filename: 文件名
            
        Returns:
            类别文件夹名称
        """
        # 获取文件扩展名(转为小写)
        ext = Path(filename).suffix.lower()
        
        # 遍历分类配置
        for category, extensions in FILE_CATEGORIES.items():
            if ext in extensions:
                return category
        
        # 无法分类,返回默认文件夹
        return DEFAULT_FOLDER
    
    def organize(self, dry_run=False):
        """执行文件整理
        
        Args:
            dry_run: 如果为 True,只预览不实际移动
        """
        # 统计信息
        stats = {'moved': 0, 'skipped': 0, 'errors': 0}
        
        # 遍历下载文件夹中的所有文件
        for file_path in self.download_folder.iterdir():
            # 跳过文件夹
            if file_path.is_dir():
                continue
            
            # 跳过脚本文件自身
            if file_path.name in ['organizer.py', 'config.py']:
                print(f"⏭️  跳过:{file_path.name}")
                stats['skipped'] += 1
                continue
            
            # 获取目标类别
            category = self.get_category(file_path.name)
            
            # 创建目标文件夹(如果不存在)
            target_folder = self.download_folder / category
            target_folder.mkdir(exist_ok=True)
            
            # 目标文件路径
            target_path = target_folder / file_path.name
            
            # 处理重名文件
            if target_path.exists():
                # 添加数字后缀
                counter = 1
                while target_path.exists():
                    new_name = f"{file_path.stem}_{counter}{file_path.suffix}"
                    target_path = target_folder / new_name
                    counter += 1
            
            # 执行移动
            if dry_run:
                print(f"👉 预览:{file_path.name}{category}/")
                stats['moved'] += 1
            else:
                try:
                    shutil.move(str(file_path), str(target_path))
                    print(f"✅ 移动:{file_path.name}{category}/")
                    stats['moved'] += 1
                except Exception as e:
                    print(f"❌ 错误:{file_path.name} - {e}")
                    stats['errors'] += 1
        
        # 打印统计
        print("\n" + "="*50)
        print(f"📊 整理完成!")
        print(f"   移动文件:{stats['moved']} 个")
        print(f"   跳过文件:{stats['skipped']} 个")
        print(f"   错误:{stats['errors']} 个")
        print("="*50)
        
        return stats


def main():
    """主函数"""
    import sys
    
    print("🚀 文件整理器启动...")
    print()
    
    # 检查命令行参数
    dry_run = '--dry-run' in sys.argv or '-n' in sys.argv
    
    if dry_run:
        print("⚠️  预览模式:不会实际移动文件\n")
    
    try:
        # 创建整理器
        organizer = FileOrganizer()
        print()
        
        # 执行整理
        organizer.organize(dry_run=dry_run)
        
    except FileNotFoundError as e:
        print(f"❌ 错误:{e}")
        sys.exit(1)
    except Exception as e:
        print(f"❌ 未知错误:{e}")
        sys.exit(1)


if __name__ == '__main__':
    main()

🧪 第四步:测试运行

预览模式(推荐先试用)

Bash
# 先预览,不实际移动
python organizer.py --dry-run

输出示例:

🚀 文件整理器启动...

📁 整理目标:/home/user/Downloads

👉 预览:photo.jpg → 图片/
👉 预览:document.pdf → 文档/
👉 预览:video.mp4 → 视频/
⏭️  跳过:organizer.py

==================================================
📊 整理完成!
   移动文件:15 个
   跳过文件:1 个
   错误:0 个
==================================================

正式运行

Bash
# 确认无误后,正式运行
python organizer.py

🎨 第五步:进阶功能

1. 添加日志功能

Python
# 在 organizer.py 中添加
import logging
from datetime import datetime

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('organizer.log'),
        logging.StreamHandler()
    ]
)

# 在移动文件时记录日志
logging.info(f"移动:{file_path.name}{category}/")

2. 添加定时任务(Linux/macOS)

Bash
# 编辑 crontab
crontab -e

# 添加每天凌晨 2 点执行的任務
0 2 * * * /usr/bin/python3 /path/to/organizer.py >> /path/to/organizer.log 2>&1

3. 添加 Windows 任务计划程序

PowerShell
# 使用 PowerShell 创建定时任务
$action = New-ScheduledTaskAction -Execute "python" -Argument "C:\path\to\organizer.py"
$trigger = New-ScheduledTaskTrigger -Daily -At 2am
Register-ScheduledTask -TaskName "FileOrganizer" -Action $action -Trigger $trigger

4. 添加 GUI 界面(可选)

Python
# 使用 tkinter 创建简单 GUI
import tkinter as tk
from tkinter import filedialog, messagebox

def select_folder():
    folder = filedialog.askdirectory()
    if folder:
        organizer = FileOrganizer(folder)
        organizer.organize()
        messagebox.showinfo("完成", "文件整理完成!")

# 创建窗口
root = tk.Tk()
root.title("文件整理器")
root.geometry("300x200")

# 添加按钮
btn = tk.Button(root, text="选择文件夹并整理", command=select_folder)
btn.pack(pady=50)

root.mainloop()

📦 完整代码打包

创建 requirements.txt

TXT
# requirements.txt
# 本项目使用 Python 标准库,无需额外依赖

创建 README.md

Markdown
# 文件整理器

自动整理下载文件夹的 Python 脚本。

## 使用方法

```bash
# 预览模式
python organizer.py --dry-run

# 正式运行
python organizer.py

配置

编辑 config.py 自定义文件分类规则。

许可证

MIT License


## 🎓 学习要点

通过这个项目,你练习了:

- ✅ ___INLINE_CODE_2___ 模块处理文件路径
- ✅ ___INLINE_CODE_3___ 模块移动文件
- ✅ 字典数据结构的使用
- ✅ 函数和类的定义
- ✅ 异常处理
- ✅ 命令行参数解析
- ✅ 文件 I/O 操作

## 🚀 扩展思路

这个项目可以继续扩展:

1. **添加 Web 界面** - 使用 Flask/FastAPI
2. **支持云存储** - 整理后上传到网盘
3. **智能分类** - 使用机器学习识别文件内容
4. **重复文件检测** - 基于哈希值去重
5. **文件压缩** - 自动压缩旧文件

## 💡 小结

这个项目虽然简单,但非常实用。你可以:

- 直接使用,整理自己的下载文件夹
- 作为 Python 练手项目,学习文件操作
- 作为起点,开发更复杂的功能

**编程的本质是解决问题。** 从解决自己的小问题开始,逐步成长为能解决大问题的程序员。

---

**你的下载文件夹现在整洁了吗?** 🧹

欢迎在评论区分享你的使用体验或改进想法!

## 📚 相关资源

- [Python pathlib 文档](https://docs.python.org/3/library/pathlib.html)
- [Python shutil 文档](https://docs.python.org/3/library/shutil.html)
- [GitHub 项目模板](https://github.com/)
分享到:

如果这篇文章对你有帮助,欢迎请作者喝杯咖啡 ☕

加载评论中...