python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python交互式文件整理工具

基于Python开发一个交互式文件分类整理工具

作者:码银

在日常办公与学习中,下载文件夹、工作目录常因文件类型混杂(如文档、表格、代码文件共存)变得混乱,手动分类不仅耗时,还易出现文件遗漏或覆盖问题,所以本文给大家介绍了如何基于Python开发一款交互式文件整理工具,需要的朋友可以参考下

引言

在日常办公与学习中,下载文件夹、工作目录常因文件类型混杂(如文档、表格、代码文件共存)变得混乱,手动分类不仅耗时,还易出现文件遗漏或覆盖问题。本文基于Python开发一款交互式文件整理工具,通过命令行输入引导、目录有效性校验、重名文件自动编号等功能,让用户无需掌握命令行参数,仅通过简单输入即可完成文件分类,同时提供清晰的操作日志与结果汇总,大幅提升文件管理效率。

一、工具核心设计理念与功能亮点

1.1 设计理念

区别于传统命令行工具需记忆参数的操作模式,本工具以**“用户友好”** 为核心设计原则:

1.2 核心功能

功能模块具体说明
交互式目录输入提示用户输入目标目录,未输入时默认使用当前工作目录,降低操作门槛
目录有效性循环校验若用户输入无效路径(如不存在、非目录),持续提示重新输入,直至路径有效
多类型文件分类支持DOCX、PDF、Excel(xlsx/xls)、Markdown(md)、TXT、Python(py)等常见类型
重名文件智能处理目标文件夹存在同名文件时,自动添加递增编号(如报告_1.docx),避免覆盖
操作日志与结果汇总输出文件夹创建、文件移动日志,整理完成后统计“处理文件数”“跳过文件数”
跨平台兼容支持Windows、macOS、Linux系统,无需额外安装第三方依赖库

二、完整代码实现与模块解析

2.1 代码整体结构

工具代码分为三个核心模块:validate_directory(目录校验)、organize_files(文件分类逻辑)、交互式输入控制(用户引导),各模块职责清晰,便于后续扩展与维护。

import os
import shutil
from typing import Dict, Set  # 引入类型提示,提升代码可读性与维护性


def organize_files(directory: str) -> None:
    """
    整理指定目录下的文件,按扩展名分类归档到对应文件夹

    参数:
        directory: str - 需要整理的目标目录路径(绝对路径或相对路径均可)

    功能说明:
        1. 支持的文件类型及目标文件夹:
           - DOCX文件(.docx)、PDF文件(.pdf)、Excel文件(.xlsx/.xls)
           - Markdown文件(.md)、TXT文件(.txt)、Python文件(.py)
        2. 自动创建缺失的分类文件夹
        3. 重名文件自动添加编号(如"文档_1.docx")
        4. 仅处理文件,跳过目录中的子文件夹
    """
    # 1. 定义文件扩展名与目标文件夹的映射规则(便于后续扩展新类型)
    EXTENSION_TO_FOLDER: Dict[str, str] = {
        'docx': 'DOCX文件',
        'pdf': 'PDF文件',
        'xlsx': 'Excel文件',
        'xls': 'Excel文件',  # 兼容旧版Excel格式
        'md': 'Markdown文件',
        'txt': 'TXT文件',
        'py': 'Python文件'
    }

    # 2. 预创建所有分类文件夹(去重处理,避免重复创建)
    target_folders: Set[str] = set(EXTENSION_TO_FOLDER.values())  # 去重后的目标文件夹
    for folder_name in target_folders:
        folder_path: str = os.path.join(directory, folder_name)
        # 仅当文件夹不存在时创建,避免覆盖已有目录
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)
            print(f"✅ 创建分类文件夹: {os.path.abspath(folder_path)}")  # 输出绝对路径,更直观

    # 3. 遍历目录,处理所有文件
    print(f"\n📂 开始遍历目录: {os.path.abspath(directory)}")
    processed_count: int = 0  # 统计处理的文件数量
    skipped_count: int = 0    # 统计跳过的文件/文件夹数量

    for filename in os.listdir(directory):
        # 拼接文件的完整路径(处理相对路径/绝对路径统一问题)
        file_abs_path: str = os.path.abspath(os.path.join(directory, filename))

        # 跳过子文件夹(仅处理文件)
        if os.path.isdir(file_abs_path):
            skipped_count += 1
            continue

        # 提取文件扩展名(小写处理,避免大小写敏感问题,如.PDF与.pdf统一)
        file_extension: str = filename.split('.')[-1].lower() if '.' in filename else ''

        # 4. 匹配文件类型,确定目标文件夹
        if file_extension in EXTENSION_TO_FOLDER:
            target_folder_name: str = EXTENSION_TO_FOLDER[file_extension]
            target_folder_path: str = os.path.join(directory, target_folder_name)
            # 目标文件的完整路径(初始为原文件名)
            target_file_path: str = os.path.join(target_folder_path, filename)

            # 5. 处理重名文件:自动添加编号(如"报告_1.pdf")
            counter: int = 1
            while os.path.exists(target_file_path):
                # 拆分文件名与扩展名(处理无扩展名的特殊情况)
                name_without_ext: str = os.path.splitext(filename)[0]
                ext: str = os.path.splitext(filename)[1]
                # 生成新文件名(编号递增)
                new_filename: str = f"{name_without_ext}_{counter}{ext}"
                target_file_path = os.path.join(target_folder_path, new_filename)
                counter += 1

            # 6. 移动文件到目标文件夹
            shutil.move(file_abs_path, target_file_path)
            processed_count += 1
            # 输出移动日志(简化路径,仅显示相对目标目录的位置)
            relative_source: str = os.path.relpath(file_abs_path, directory)
            relative_target: str = os.path.relpath(target_file_path, directory)
            print(f"🔄 移动文件: {relative_source} → {relative_target}")
        else:
            # 不支持的文件类型,跳过处理
            skipped_count += 1
            print(f"⏭️  跳过不支持的文件类型: {filename}(扩展名: {file_extension})")

    # 7. 输出整理结果汇总
    print(f"\n📊 文件整理完成!")
    print(f"✅ 成功处理文件数量: {processed_count}")
    print(f"⏭️  跳过文件/文件夹数量: {skipped_count}")


def validate_directory(directory_path: str) -> bool:
    """
    校验目录是否有效(存在且为目录)

    参数:
        directory_path: str - 待校验的目录路径

    返回:
        bool - 有效返回True,无效返回False
    """
    if not os.path.exists(directory_path):
        print(f"❌ 错误:目录不存在 → {directory_path}")
        return False
    if not os.path.isdir(directory_path):
        print(f"❌ 错误:路径不是目录 → {directory_path}")
        return False
    return True


if __name__ == "__main__":
    # 1. 获取用户输入的目录路径(交互式引导,替换传统命令行参数)
    while True:
        target_dir: str = input("请输入需要整理的目录路径: ").strip()
        if not target_dir:
            print("ℹ️  未输入路径,将使用当前工作目录")
            target_dir = os.getcwd()
        # 校验目录有效性,有效则退出循环,无效则继续提示
        if validate_directory(target_dir):
            break
        print("❌ 目录无效,请重新输入。")

    # 2. 显示确认的目标目录(输出绝对路径,避免相对路径混淆)
    print(f"ℹ️  待整理目录: {os.path.abspath(target_dir)}")

    # 3. 执行文件整理(调用核心逻辑,保持流程连贯)
    print("\n" + "=" * 50)
    print("📋 开始执行文件分类整理")
    print("=" * 50)
    organize_files(target_dir)
    print("\n" + "=" * 50)
    print("🎉 所有整理操作已完成!")
    print("=" * 50)

三、关键模块深度解析

3.1 目录校验模块(validate_directory)

该模块是工具稳定性的核心保障,负责过滤无效路径,避免程序因路径错误崩溃:

3.2 交互式输入模块(if __name__ == "__main__")

该模块是用户交互的入口,通过while True循环实现“输入-校验-确认”的闭环:

  1. 输入处理:通过input获取用户输入,strip()去除首尾空格,避免空字符干扰;
  2. 默认路径:若用户未输入路径(直接回车),自动使用当前工作目录(os.getcwd());
  3. 循环校验:调用validate_directory校验路径,无效则提示重新输入,直至路径有效。

3.3 文件分类核心模块(organize_files)

该模块是工具的业务逻辑核心,分为“规则定义-文件夹创建-文件处理-结果汇总”四步:

  1. 规则定义:通过EXTENSION_TO_FOLDER字典映射扩展名与目标文件夹,新增文件类型仅需添加字典项(如添加'jpg': '图片文件'支持图片分类);
  2. 文件夹预创建:先创建所有分类文件夹(去重处理),避免后续移动文件时因目录不存在报错;
  3. 文件遍历与处理
    • 跳过子文件夹:通过os.path.isdir判断,仅处理文件;
    • 扩展名统一:转为小写(file_extension.lower()),解决.PDF.pdf不匹配问题;
    • 重名处理:通过while循环与counter递增,生成文件名_编号.扩展名格式的新文件名;
  4. 结果汇总:统计“处理文件数”与“跳过文件数”,输出清晰的整理报告。

四、工具使用指南与运行示例

4.1 运行环境准备

4.2 操作步骤(以Windows为例)

  1. 保存代码:将上述代码保存为file_organizer.py(文件名可自定义);
  2. 打开终端:按下Win+R,输入cmd打开命令提示符;
  3. 运行脚本:输入python file_organizer.py(需确保Python已添加到系统环境变量);
  4. 输入目录:根据提示输入目标目录路径(如C:\Users\Username\Downloads),或直接回车使用当前目录;
  5. 查看结果:等待工具执行完成,查看日志与汇总报告。

4.3 运行示例(终端输出)

请输入需要整理的目录路径: C:\Users\Test\Downloads
ℹ️  待整理目录: C:\Users\Test\Downloads

==================================================
📋 开始执行文件分类整理
==================================================
✅ 创建分类文件夹: C:\Users\Test\Downloads\DOCX文件
✅ 创建分类文件夹: C:\Users\Test\Downloads\PDF文件
✅ 创建分类文件夹: C:\Users\Test\Downloads\Excel文件
✅ 创建分类文件夹: C:\Users\Test\Downloads\Markdown文件
✅ 创建分类文件夹: C:\Users\Test\Downloads\TXT文件
✅ 创建分类文件夹: C:\Users\Test\Downloads\Python文件

📂 开始遍历目录: C:\Users\Test\Downloads
🔄 移动文件: 项目报告.docx → DOCX文件/项目报告.docx
🔄 移动文件: 数据统计.xlsx → Excel文件/数据统计.xlsx
🔄 移动文件: 学习笔记.md → Markdown文件/学习笔记.md
🔄 移动文件: 简历.pdf → PDF文件/简历.pdf
🔄 移动文件: 简历.pdf → PDF文件/简历_1.pdf  # 重名文件自动编号
⏭️  跳过不支持的文件类型: 截图.png(扩展名: png)
⏭️  跳过不支持的文件类型: 视频.mp4(扩展名: mp4)

📊 文件整理完成!
✅ 成功处理文件数量: 5
⏭️  跳过文件/文件夹数量: 3

==================================================
🎉 所有整理操作已完成!
==================================================

五、扩展与定制建议

5.1 新增文件类型支持

若需分类更多文件类型(如图片、压缩包),仅需修改EXTENSION_TO_FOLDER字典:

EXTENSION_TO_FOLDER: Dict[str, str] = {
    # 原有规则...
    'jpg': '图片文件',
    'png': '图片文件',
    'jpeg': '图片文件',
    'zip': '压缩文件',
    'rar': '压缩文件',
    '7z': '压缩文件'
}

5.2 自定义文件夹名称

若需修改分类文件夹名称(如将“Excel文件”改为“表格文件”),直接修改字典值即可:

EXTENSION_TO_FOLDER: Dict[str, str] = {
    # 原有规则...
    'xlsx': '表格文件',
    'xls': '表格文件'  # 统一文件夹名称
}

5.3 增加文件筛选功能

若需仅处理指定日期范围内的文件(如近30天的文件),可在organize_files中添加时间筛选逻辑:

import time

# 在文件遍历循环中添加时间筛选
file_mtime = os.path.getmtime(file_abs_path)  # 获取文件最后修改时间(时间戳)
thirty_days_ago = time.time() - 30 * 24 * 3600  # 30天前的时间戳
if file_mtime < thirty_days_ago:
    skipped_count += 1
    print(f"⏭️  跳过过期文件: {filename}(最后修改时间超过30天)")
    continue

以上就是基于Python开发一个交互式文件分类整理工具的详细内容,更多关于Python交互式文件整理工具的资料请关注脚本之家其它相关文章!

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