python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python按文件后缀名归类桌面文件

使用Python按文件后缀名自动归类杂乱桌面文件

作者:小庄-Python办公

还在为桌面文件杂乱而烦恼吗,本文将教你用Python按文件后缀名自动分类整理文件,无需安装任何额外库,只需使用内置的pathlib和shutil模块,你将学会如何将PDF、Word、图片、视频等文件自动移动到对应文件夹,并包含避免覆盖、预览模式等实用技巧,让你的桌面瞬间整洁

场景引入

你的桌面是不是这样?

桌面/
├── 合同终稿_v3_final.pdf
├── 会议纪要.png
├── 预算报表.xlsx
├── 产品宣传视频.mp4
├── 老照片_2019.jpg
├── 项目方案.docx
├── 音乐文件.mp3
├── 截图_20240301.png
└── ...还有 200+ 个文件散落在桌面

每次想找某个文件都要翻半天。本节教你用 Python 按文件后缀名自动分类,桌面瞬间整洁。

技术原理

核心思路非常简单:

遍历目录 → 获取每个文件的后缀名 → 按后缀名创建文件夹 → 移动文件到对应文件夹
后缀归类文件夹说明
.pdfPDF文档/PDF 文件
.doc, .docxWord文档/Word 文件
.xls, .xlsxExcel表格/Excel 文件
.jpg, .png, .gif, .bmp图片/图片文件
.mp4, .avi, .mov视频/视频文件
.mp3, .wav, .flac音频/音频文件
.zip, .rar, .7z压缩包/压缩文件
.py, .js, .java代码文件/程序源代码

环境准备

无需安装额外库,使用 Python 内置模块即可。

完整代码

import os
import shutil
from pathlib import Path

# 文件类型分类规则
FILE_CATEGORIES = {
    # 文档类
    '.pdf': 'PDF文档',
    '.doc': 'Word文档',
    '.docx': 'Word文档',
    '.wps': 'Word文档',

    # 表格类
    '.xls': 'Excel表格',
    '.xlsx': 'Excel表格',
    '.csv': 'Excel表格',
    '.tsv': 'Excel表格',

    # 演示类
    '.ppt': 'PPT演示',
    '.pptx': 'PPT演示',

    # 图片类
    '.jpg': '图片',
    '.jpeg': '图片',
    '.png': '图片',
    '.gif': '图片',
    '.bmp': '图片',
    '.svg': '图片',
    '.webp': '图片',
    '.ico': '图片',
    '.tiff': '图片',

    # 视频类
    '.mp4': '视频',
    '.avi': '视频',
    '.mov': '视频',
    '.mkv': '视频',
    '.flv': '视频',
    '.wmv': '视频',

    # 音频类
    '.mp3': '音频',
    '.wav': '音频',
    '.flac': '音频',
    '.aac': '音频',
    '.ogg': '音频',

    # 压缩包类
    '.zip': '压缩包',
    '.rar': '压缩包',
    '.7z': '压缩包',
    '.tar': '压缩包',
    '.gz': '压缩包',

    # 代码类
    '.py': '代码文件',
    '.js': '代码文件',
    '.java': '代码文件',
    '.c': '代码文件',
    '.cpp': '代码文件',
    '.html': '代码文件',
    '.css': '代码文件',

    # 其他
    '.txt': '文本文件',
    '.md': '文本文件',
    '.exe': '可执行程序',
    '.msi': '可执行程序',
    '.dmg': '可执行程序',
}


def organize_files(target_dir, dry_run=False):
    """
    按文件后缀名自动归类文件夹中的文件

    参数:
        target_dir: 要整理的目录路径
        dry_run: True=只预览不移动,False=执行移动
    """
    target_path = Path(target_dir)

    if not target_path.exists():
        print(f"错误:目录 {target_dir} 不存在!")
        return

    # 统计信息
    moved_count = 0
    skipped_count = 0
    errors = []

    # 遍历目录中的所有文件(不递归子文件夹)
    for file_path in target_path.iterdir():
        # 跳过文件夹
        if file_path.is_dir():
            continue

        # 获取文件后缀
        suffix = file_path.suffix.lower()

        # 查找对应的分类
        category = FILE_CATEGORIES.get(suffix, '其他文件')

        # 创建分类文件夹
        category_dir = target_path / category
        category_dir.mkdir(exist_ok=True)

        # 目标文件路径
        dest = category_dir / file_path.name

        # 如果目标已存在,加序号避免覆盖
        if dest.exists():
            stem = file_path.stem
            counter = 1
            while dest.exists():
                dest = category_dir / f"{stem}_{counter}{suffix}"
                counter += 1

        # 执行移动
        if dry_run:
            print(f"[预览] {file_path.name} → {category}/")
            moved_count += 1
        else:
            try:
                shutil.move(str(file_path), str(dest))
                print(f"[已移动] {file_path.name} → {category}/")
                moved_count += 1
            except Exception as e:
                errors.append(f"{file_path.name}: {e}")
                skipped_count += 1

    # 汇总报告
    print(f"\n{'='*40}")
    print(f"整理完成!")
    print(f"移动文件: {moved_count} 个")
    if skipped_count > 0:
        print(f"跳过文件: {skipped_count} 个")
    if errors:
        print(f"\n错误列表:")
        for err in errors:
            print(f"  - {err}")


# ==================== 使用示例 ====================
if __name__ == "__main__":
    # ========== 模式 1:先预览,确认无误 ==========
    # organize_files(r"C:\Users\用户名\Desktop", dry_run=True)

    # ========== 模式 2:执行移动 ==========
    # organize_files(r"C:\Users\用户名\Desktop", dry_run=False)

    # ========== 模式 3:整理下载文件夹 ==========
    organize_files(r"D:\Downloads", dry_run=False)

代码逐行解析

1. Path 对象

target_path = Path(target_dir)

pathlib.Path 是 Python 3 推荐的路径操作方式,比 os.path 更直观:

操作os.pathpathlib
拼接路径os.path.join(a, b)a / b
获取后缀os.path.splitext(f)[1]f.suffix
获取文件名os.path.basename(f)f.name
判断目录os.path.isdir(f)f.is_dir()

2. 获取后缀并分类

suffix = file_path.suffix.lower()
category = FILE_CATEGORIES.get(suffix, '其他文件')

3. 避免覆盖

if dest.exists():
    stem = file_path.stem
    counter = 1
    while dest.exists():
        dest = category_dir / f"{stem}_{counter}{suffix}"
        counter += 1

如果目标文件夹已有同名文件,自动加序号:报告.pdf → 报告_1.pdf → 报告_2.pdf

4. dry_run 预览模式

if dry_run:
    print(f"[预览] {file_path.name} → {category}/")
else:
    shutil.move(str(file_path), str(dest))

先运行 dry_run=True 预览分类结果,确认无误后再执行实际移动,避免误操作。

进阶技巧

技巧 1:按文件大小进一步分类

def get_size_category(size_bytes):
    if size_bytes < 1024 * 1024:  # < 1MB
        return '小文件(<1MB)'
    elif size_bytes < 100 * 1024 * 1024:  # < 100MB
        return '中等文件(1-100MB)'
    else:
        return '大文件(>100MB)'

# 在移动时结合大小
size_category = get_size_category(file_path.stat().st_size)

技巧 2:按日期分类(按创建月份归档)

from datetime import datetime

create_time = datetime.fromtimestamp(file_path.stat().st_ctime)
month_folder = create_time.strftime('%Y-%m')

技巧 3:清理空文件夹

整理完成后,可以清理原目录中残留的空文件夹:

import os

for dirpath, dirnames, filenames in os.walk(target_dir, topdown=False):
    if not filenames and not dirnames:
        os.rmdir(dirpath)
        print(f"已删除空文件夹: {dirpath}")

常见问题

Q1:移动后文件找不到了?

使用 dry_run=True 先预览。如果已经移动了,可以在分类文件夹中找到文件——文件名没有改变,只是被移到了子文件夹中。

Q2:某些文件无法移动(“文件正在使用中”)?

原因:文件被其他程序打开或占用。

解决:关闭相关程序后再运行脚本,或该文件会出现在"错误列表"中。

Q3:想忽略某些文件(如 .lnk 快捷方式)?

在循环开头添加:

if file_path.suffix.lower() in ('.lnk', '.ini', '.tmp'):
    continue

总结

核心操作代码作用
获取后缀file_path.suffix.lower()统一小写的扩展名
查分类表FILE_CATEGORIES.get(suffix)映射到文件夹名
创建目录category_dir.mkdir(exist_ok=True)不存在则创建
移动文件shutil.move(src, dest)物理移动文件
避免覆盖自动加序号文件_1.pdf
安全预览dry_run=True只打印不移动

本节学会了用 Python 自动整理杂乱目录,让桌面和下载文件夹保持整洁。

以上就是使用Python按文件后缀名自动归类杂乱桌面文件的详细内容,更多关于Python按文件后缀名归类桌面文件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文