200字
【Python办公】自动以文件批量重命名(按照一定规则)
2025-10-22
2025-10-22
  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双
  • 💻 个人主页——>个人主页欢迎访问
  • 😸 Github主页——>Github主页欢迎访问
  • ❓ 知乎主页——>知乎主页欢迎访问
  • 🏳️‍🌈 CSDN博客主页:请点击——> 一晌小贪欢的博客主页求关注
  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅
  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅
  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • ❤️ 欢迎各位佬关注! ❤️


image

前言

在日常工作中,我们经常需要批量处理文件名,特别是那些按照特定规则命名的文件。传统的手动重命名方式效率低下,而现有的批量重命名工具往往功能复杂或不够灵活。今天,我想分享一个用Python和Tkinter开发的文件重命名工具的设计思路和实现过程。

项目背景

需求分析

在企业环境中,文件命名通常遵循一定的规范,比如:

  • 项目_报告_2024_最终版.docx
  • 会议_记录_部门_周例会.pdf
  • 数据_分析_销售_Q4.xlsx

这些文件名通常用下划线分隔不同的信息段,但有时我们需要:

  1. 重新排列这些信息段的顺序
  2. 选择性保留某些信息段
  3. 添加新的信息段
  4. 批量应用相同的规则到多个文件

技术选型

  • 语言:Python 3.x
  • GUI框架:Tkinter(内置,无需额外依赖)
  • 文件操作:os, shutil, pathlib

选择Tkinter的原因:

  • 内置库,部署简单
  • 跨平台兼容性好
  • 对于这类工具足够轻量

核心功能设计

1. 文件名解析与显示

def refresh_files(self):
    """刷新文件列表"""
    if not self.current_directory:
        return
      
    # 清空现有数据
    for item in self.tree.get_children():
        self.tree.delete(item)
    self.files_data.clear()
  
    # 扫描目录中的文件
    try:
        for file_path in Path(self.current_directory).iterdir():
            if file_path.is_file():
                name_without_ext = file_path.stem
                extension = file_path.suffix
                name_parts = name_without_ext.split('_')
              
                file_info = {
                    'original_name': file_path.name,
                    'name_parts': name_parts,
                    'extension': extension,
                    'new_name': file_path.name
                }
              
                self.files_data.append(file_info)

这个函数负责:

  • 扫描指定目录下的所有文件
  • 按下划线分割文件名
  • 将信息存储在数据结构中供后续处理

2. 多选框编辑界面

最初的设计使用拖拽排序,但在实际使用中发现用户更希望有一种"选择性组合"的方式。于是我们改进为多选框模式:

def open_edit_window(self, file_info, file_index):
    """打开编辑窗口"""
    # ... 窗口初始化代码 ...
  
    # 为每个部分创建多选框
    for i, part in enumerate(file_info['name_parts']):
        var = tk.BooleanVar()
        var.set(True)  # 默认全选
        self.checkbox_vars.append(var)
      
        checkbox = ttk.Checkbutton(
            scrollable_frame, 
            text=f"{i+1}. {part}", 
            variable=var,
            command=lambda idx=i: self.on_checkbox_change(idx, file_info)
        )
        checkbox.pack(anchor=tk.W, pady=2)

3. 智能一键应用功能

这是工具的核心亮点。用户只需要修改一个文件作为模板,就能将相同的规则应用到其他文件:

def apply_first_pattern(self):
    """根据第一个修改好的文件的选择规则一键应用到其他文件"""
    # 找到模板文件
    template_file = None
    for i, file_info in enumerate(self.files_data):
        if file_info['original_name'] != file_info['new_name']:
            template_file = file_info
            template_index = i
            break
  
    # 分析选择规则
    template_original_parts = original_name_without_ext.split('_')
    template_selected_parts = template_file['name_parts']
  
    selected_indices = []
    custom_parts = []
  
    for selected_part in template_selected_parts:
        if selected_part in template_original_parts:
            selected_indices.append(template_original_parts.index(selected_part))
        else:
            custom_parts.append(selected_part)
  
    # 应用到其他文件...

用户体验优化

1. 实时预览

每次用户修改选择时,都会实时更新文件名预览:

def update_checkbox_preview(self, file_info):
    """更新多选框模式的文件名预览"""
    if self.selected_parts:
        new_name = '_'.join(self.selected_parts) + file_info['extension']
    else:
        new_name = file_info['extension']
      
    self.preview_label.config(text=new_name)

2. 批量操作确认

在执行批量复制或移动前,提供详细的预览和确认:

def preview_changes(self):
    """预览所有更改"""
    changes = []
    for file_info in self.files_data:
        if file_info['original_name'] != file_info['new_name']:
            changes.append(f"{file_info['original_name']} → {file_info['new_name']}")
  
    if not changes:
        messagebox.showinfo("预览", "没有文件需要重命名")
        return
      
    preview_text = "\n".join(changes)
    messagebox.showinfo("预览更改", f"将进行以下更改:\n\n{preview_text}")

3. 错误处理和用户反馈

def _batch_operation(self, operation):
    """执行批量操作"""
    try:
        # 操作逻辑...
        success_count += 1
    except Exception as e:
        error_count += 1
        error_details.append(f"{file_info['original_name']}: {str(e)}")
  
    # 详细的结果反馈
    result_msg = f"操作完成!\n成功: {success_count} 个文件"
    if error_count > 0:
        result_msg += f"\n失败: {error_count} 个文件"
        result_msg += f"\n\n错误详情:\n" + "\n".join(error_details)

技术亮点

1. 模块化设计

整个应用采用面向对象设计,功能模块清晰分离:

  • UI初始化和布局
  • 文件扫描和数据处理
  • 编辑逻辑和预览
  • 批量操作和错误处理

2. 数据结构设计

使用字典存储文件信息,便于数据传递和状态管理:

file_info = {
    'original_name': file_path.name,
    'name_parts': name_parts,
    'extension': extension,
    'new_name': file_path.name
}

3. 事件驱动的交互

通过回调函数实现响应式的用户界面:

# 多选框状态变化
command=lambda idx=i: self.on_checkbox_change(idx, file_info)

# 双击编辑
self.tree.bind("<Double-1>", self.on_item_double_click)

使用场景和效果

场景1:日期前置

  • 原始:项目_报告_2024_最终版.docx
  • 需求:将日期移到最前面
  • 操作:选择"2024"、"项目"、"报告"、"最终版"
  • 结果:2024_项目_报告_最终版.docx

场景2:信息筛选

  • 原始:会议_记录_部门_周例会_20241201.pdf
  • 需求:只保留核心信息
  • 操作:选择"会议"、"记录"、"20241201"
  • 结果:会议_记录_20241201.pdf

场景3:批量标准化

通过一键应用功能,可以将一个文件的命名规则快速应用到整个文件夹,大大提高工作效率。

部署和分发

打包为可执行文件

使用PyInstaller可以将Python脚本打包为独立的可执行文件:

pip install pyinstaller
pyinstaller --onefile --windowed --icon=文件.ico file_renamer.py

创建便捷启动

提供批处理文件 启动工具.bat

@echo off
cd /d "%~dp0"
python file_renamer.py
pause

总结与展望

这个文件重命名工具从最初的拖拽排序发展到现在的多选框模式,体现了软件开发中"以用户为中心"的设计理念。通过不断收集用户反馈和优化交互方式,我们创造了一个既简单易用又功能强大的工具。

未来改进方向

  1. 正则表达式支持:支持更复杂的文件名模式匹配
  2. 模板保存:允许用户保存和重用常用的重命名规则
  3. 撤销功能:提供操作撤销机制
  4. 多语言支持:国际化界面文本
  5. 插件系统:允许用户自定义扩展功能

开发感悟

  1. 用户体验至上:技术实现要服务于用户需求,而不是炫技
  2. 迭代优化:软件开发是一个持续改进的过程
  3. 简单即美:复杂的功能要用简单的方式呈现
  4. 错误处理:健壮的错误处理是用户体验的重要组成部分

通过这个项目,我深刻体会到了从用户需求出发,通过技术手段解决实际问题的成就感。希望这个工具能够帮助更多人提高工作效率,也希望这篇文章能为其他开发者提供一些有用的参考。

项目地址:[GitHub链接](IKUN2788/Batch-file-renaming: 批量文件重命名)
技术栈:Python, Tkinter, PyInstaller
适用场景:批量文件重命名、文件整理、办公自动化

如果您觉得这个工具有用,欢迎Star和Fork!


image-giWK.png

【Python办公】自动以文件批量重命名(按照一定规则)
作者
一晌小贪欢
发表于
2025-10-22
License
CC BY-NC-SA 4.0

评论