2. 文件分类整理

任务说明

你的下载文件夹或工作目录中往往混杂着图片、文档、压缩包、脚本等多种类型文件,手动整理费时且容易出错。本案例实现一个Python脚本,扫描指定文件夹,根据文件扩展名将文件自动移动到对应的分类子文件夹(如“图片”“文档”“压缩包”“代码”“其他”),并处理重名文件避免覆盖。

实现代码

import os
import shutil
from pathlib import Path

# 扩展名分类映射
EXTENSION_MAP = {
    '.jpg': '图片', '.jpeg': '图片', '.png': '图片', '.gif': '图片', '.bmp': '图片', '.svg': '图片',
    '.txt': '文档', '.pdf': '文档', '.doc': '文档', '.docx': '文档', '.xls': '文档', '.xlsx': '文档', '.ppt': '文档', '.pptx': '文档',
    '.zip': '压缩包', '.rar': '压缩包', '.7z': '压缩包', '.tar': '压缩包', '.gz': '压缩包',
    '.py': '代码', '.js': '代码', '.html': '代码', '.css': '代码', '.java': '代码', '.cpp': '代码', '.c': '代码',
}

def classify_file(filename):
    """根据文件扩展名返回分类名称,未知类型归为'其他'"""
    ext = Path(filename).suffix.lower()
    return EXTENSION_MAP.get(ext, '其他')

def organize_folder(folder_path):
    """
    将folder_path中的文件按扩展名移动到对应子文件夹。
    返回移动的文件数量。
    """
    folder = Path(folder_path)
    if not folder.exists():
        raise FileNotFoundError(f"文件夹不存在: {folder_path}")
    
    moved_count = 0
    for item in folder.iterdir():
        # 跳过子文件夹本身
        if item.is_dir():
            continue
        
        category = classify_file(item.name)
        target_dir = folder / category
        target_dir.mkdir(exist_ok=True)
        
        # 处理重名:若目标已存在同名文件,则在文件名后加数字
        target_path = target_dir / item.name
        if target_path.exists():
            base_name = item.stem
            suffix = item.suffix
            counter = 1
            while True:
                new_name = f"{base_name}_{counter}{suffix}"
                target_path = target_dir / new_name
                if not target_path.exists():
                    break
                counter += 1
        
        shutil.move(str(item), str(target_path))
        moved_count += 1
    
    return moved_count

if __name__ == '__main__':
    # 使用示例:请将下方路径替换为你要整理的文件夹路径
    target_folder = r"C:\Users\YourName\Downloads"  # 修改为实际路径
    count = organize_folder(target_folder)
    print(f"整理完成,共移动 {count} 个文件")

运行与验证

运行方式:将上述代码保存为 organize_files.py,修改 target_folder 变量为你要整理的文件夹路径(建议先在一个测试文件夹中运行),然后在终端执行:

python organize_files.py

验证方法:

  1. 在测试文件夹中预先放入几个不同扩展名的文件(如 photo.jpg、report.pdf、archive.zip、script.py、notes.txt、unknown.xyz);
  2. 运行脚本后,检查文件夹中是否自动生成了“图片”“文档”“压缩包”“代码”“其他”五个子文件夹;
  3. 确认每个文件已移动到对应分类子文件夹中,且原位置不再有该文件;
  4. 再放入一个与子文件夹中已有文件同名的文件(如再次放入 photo.jpg),重新运行脚本,确认新文件被重命名为 photo_1.jpg 且没有覆盖原文件。

判定标准:所有文件均按扩展名进入正确分类子文件夹,重名文件自动改名且无文件丢失,控制台输出移动文件数量与实际文件数一致,即视为通过。

文件分类整理流程 杂乱文件夹 photo.jpg report.pdf archive.zip script.py notes.txt unknown.xyz 分类逻辑 读取扩展名 ↓ EXTENSION_MAP 匹配 ↓ 未匹配 → “其他” 分类子文件夹 📁 图片 photo.jpg 📁 文档 report.pdf 📁 压缩包 archive.zip 📁 代码 script.py 📁 文档 notes.txt 📁 其他 unknown.xyz 重名处理 同名文件自动追加编号 photo.jpg → photo_1.jpg shutil.move() 实现跨目录移动,Path 处理路径兼容 Windows/macOS/Linux