Python实用工具:批量文件重命名指南

编程基础第一期《7-30》–文件批量重命名工具

📑 前言

在日常工作和学习中,我们经常需要对大量文件进行重命名操作。手动一个个修改既耗时又容易出错,特别是当文件数量较多时。本文将介绍一个使用Python开发的文件批量重命名工具,它提供了多种重命名模式,可以大大提高文件管理效率。

✨ 功能特点

  • 多种重命名模式:前缀添加、后缀添加、字符串替换、序列号命名
  • 交互式操作界面:清晰的提示和引导
  • 安全机制:操作前确认、冲突检测、错误处理
  • 灵活配置:可自定义序列号格式、起始值和分隔符
  • 🧩 模块化设计

    本工具采用模块化设计,将不同功能拆分为独立函数,提高代码可读性和可维护性。下面我们来逐一了解各个模块的实现。

    1️⃣ 目录路径获取模块

    import os
    
    
    def get_directory():
        """获取用户输入的有效目录路径"""
        while True:
            dir_path = input("请输入要处理的目录路径:").strip()
            if os.path.isdir(dir_path):
                return os.path.normpath(dir_path)
            print("× 目录不存在,请重新输入")
    

    2️⃣ 文件列表获取模块

    import os
    
    def list_files(dir_path):
        """列出目录中的所有文件并返回列表"""
        files = [f for f in sorted(os.listdir(dir_path))
                 if os.path.isfile(os.path.join(dir_path, f))]
    
        print("\n目录文件列表:")
        for idx, f in enumerate(files, 1):
            print(f"{idx:02d}. {f}")
        return files
    

    3️⃣ 重命名模式选择模块

    def get_rename_mode():
        """获取用户选择的命名模式"""
        print("\n请选择重命名模式:")
        print("1. 添加前缀\t2. 添加后缀")
        print("3. 替换字符串\t4. 序列号")
        while True:
            mode = input("请输入选项 (1-4):").strip()
            if mode in {'1', '2', '3', '4'}:
                return mode
            print("× 无效输入,请重新选择")
    

    4️⃣ 序列号参数配置模块

    def get_sequence_params():
        """获取序列号模式参数"""
        print("\n序列号模式参数设置:")
        try:
            start = int(input("起始数字 (默认1):") or 1)
            digits = int(input("位数 (默认3):") or 3)
            sep = input("分隔符 (默认_):") or "_"
            return start, digits, sep
        except ValueError:
            print("! 输入无效,使用默认设置:起始=1,位数=3,分隔符=_")
            return 1, 3, "_"
    

    💻 完整代码实现

    下面是整合了所有模块的完整代码实现:

    import os
    
    
    def get_directory():
        """获取用户输入的有效目录路径"""
        while True:
            dir_path = input("请输入要处理的目录路径:").strip()
            if os.path.isdir(dir_path):
                return os.path.normpath(dir_path)
            print("× 目录不存在,请重新输入")
    
    
    def list_files(dir_path):
        """列出目录中的所有文件并返回列表"""
        files = [f for f in sorted(os.listdir(dir_path))
                 if os.path.isfile(os.path.join(dir_path, f))]
    
        print("\n目录文件列表:")
        for idx, f in enumerate(files, 1):
            print(f"{idx:02d}. {f}")
        return files
    
    
    def get_rename_mode():
        """获取用户选择的命名模式"""
        print("\n请选择重命名模式:")
        print("1. 添加前缀\t2. 添加后缀")
        print("3. 替换字符串\t4. 序列号")
        while True:
            mode = input("请输入选项 (1-4):").strip()
            if mode in {'1', '2', '3', '4'}:
                return mode
            print("× 无效输入,请重新选择")
    
    
    def get_sequence_params():
        """获取序列号模式参数"""
        print("\n序列号模式参数设置:")
        try:
            start = int(input("起始数字 (默认1):") or 1)
            digits = int(input("位数 (默认3):") or 3)
            sep = input("分隔符 (默认_):") or "_"
            return start, digits, sep
        except ValueError:
            print("! 输入无效,使用默认设置:起始=1,位数=3,分隔符=_")
            return 1, 3, "_"
    
    
    def main():
        # 获取目录路径
        dir_path = get_directory()
    
        # 获取文件列表
        files = list_files(dir_path)
        if not files:
            print("! 该目录没有可操作文件")
            return
    
        # 确认操作
        if input("\n是否继续操作?(y/n) ").lower() != 'y':
            print("操作已取消")
            return
    
        # 获取重命名模式
        mode = get_rename_mode()
    
        # 获取模式参数
        params = {}
        if mode == '1':
            params['prefix'] = input("\n请输入要添加的前缀:")
        elif mode == '2':
            params['suffix'] = input("\n请输入要添加的后缀:")
        elif mode == '3':
            params['old'] = input("\n请输入要替换的字符串:")
            params['new'] = input("请输入替换后的新字符串:")
        elif mode == '4':
            params['start'], params['digits'], params['sep'] = get_sequence_params()
    
        # 二次确认
        if input("\n!! 确认执行重命名操作?(y/n) ").lower() != 'y':
            print("操作已取消")
            return
    
        # 执行重命名
        counter = 0
        current_num = params.get('start', 0)
    
        for filename in files:
            # 跳过隐藏文件(可选)
            if filename.startswith('.'):
                continue
    
            # 分割文件名和扩展名
            file_path = os.path.join(dir_path, filename)
            base, ext = os.path.splitext(filename)
            new_base = base
    
            # 根据模式生成新文件名
            if mode == '1':
                new_base = f"{params['prefix']}{base}"
            elif mode == '2':
                new_base = f"{base}{params['suffix']}"
            elif mode == '3':
                new_base = base.replace(params['old'], params['new'])
            elif mode == '4':
                num_format = f"{current_num:0{params['digits']}}d"
                new_base = f"{num_format}{params['sep']}{base}"
                current_num += 1
    
            new_name = f"{new_base}{ext}"
            new_path = os.path.join(dir_path, new_name)
    
            # 跳过未修改的情况
            if new_name == filename:
                continue
    
            # 执行重命名
            try:
                if not os.path.exists(new_path):
                    os.rename(file_path, new_path)
                    print(f"√ {filename} → {new_name}")
                    counter += 1
                else:
                    print(f"! 冲突:{new_name} 已存在")
            except Exception as e:
                print(f"× 错误:重命名 {filename} 失败 - {str(e)}")
    
        print(f"\n操作完成,成功重命名 {counter}/{len(files)} 个文件")
    
    
    if __name__ == "__main__":
        print("=== 文件批量重命名工具 ===")
        main()
    

    📊 代码解析

    核心设计思路

    1. 用户体验优先

    2. 清晰的提示信息和错误反馈
    3. 操作前确认机制,防止误操作
    4. 列表显示处理文件,让用户了解操作对象
    5. 安全性考虑

    6. 检测目标文件是否存在,避免覆盖
    7. 异常捕获处理,确保程序稳定运行
    8. 操作结果明确展示,方便用户核对
    9. 功能模块化

    10. 每个功能独立封装为函数
    11. 清晰的函数命名和注释
    12. 参数传递而非全局变量

    技术要点

    1. 路径处理

    2. 使用os.path.isdir()验证目录有效性
    3. 使用os.path.normpath()标准化路径格式
    4. 使用os.path.join()构建完整文件路径
    5. 使用os.path.splitext()分离文件名和扩展名
    6. 列表推导式

    7. [f for f in sorted(os.listdir(dir_path)) if os.path.isfile(os.path.join(dir_path, f))]
    8. 一行代码实现文件过滤和排序
    9. 字符串格式化

    10. f-string实现动态字符串拼接
    11. 使用{current_num:0{params['digits']}}d实现动态宽度的数字格式化
    12. 输入验证与默认值

    13. 使用input(...) or default_value提供默认值
    14. 使用集合{'1', '2', '3', '4'}高效验证输入选项

    🔍 进阶改进方向

    1. 图形界面:添加GUI界面,提升用户体验
    2. 正则表达式支持:增加正则表达式匹配和替换功能
    3. 预览功能:在执行前预览重命名结果
    4. 撤销功能:添加操作日志和撤销功能
    5. 批处理模式:支持从配置文件读取参数,实现无人工干预的批处理
    6. 递归处理:支持递归处理子目录中的文件

    今日分享语录

    观棋不语真君子 落子无悔大丈夫

    作者:笨笨轻松熊

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python实用工具:批量文件重命名指南

    发表回复