用 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/)