工具分享02 | Python批量文件重命名工具

大家好,我是欧K~

本期使用Python的Tkinter制作一个批量修改文件名的工具,可以选择文件类型、自定义添加前缀、后缀及文件名字符替换(可单选、可多选)。希望对大家有所帮助,如有疑问或者需要改进的地方可以联系小编。

1. 运行流程

1.1 工具面板

1.2 选择原文件夹、目标文件夹,添加前缀并预览

1.3 执行重命名操作

1.4 重命名完成

1.5 执行结果

1.6 添加前缀及后缀


执行结果

1.7 替换部分名称


执行结果

1.8 前缀+后缀+替换


执行结果

2. 绘图


2.1 框架结构布局

def create_widgets(self):
    # 文件夹选择部分
    folder_frame = ttk.LabelFrame(self.root, text="文件夹设置", style="Bold.TLabelframe")
    folder_frame.pack(fill="x", padx=10, pady=10, ipadx=5, ipady=5)

    # 源文件夹
    ttk.Label(folder_frame, text="源文件夹:").grid(row=0, column=0, sticky="w", padx=5, pady=5)
    self.source_var = tk.StringVar()
    source_entry = ttk.Entry(folder_frame, textvariable=self.source_var)
    source_entry.grid(row=0, column=1, sticky="we", padx=5, pady=5)
    ttk.Button(folder_frame, text="浏览...", command=self.select_source_folder).grid(row=0, column=2, padx=5, pady=5)

    # 目标文件夹
    ttk.Label(folder_frame, text="目标文件夹:").grid(row=1, column=0, sticky="w", padx=5, pady=5)
    self.dest_var = tk.StringVar()
    dest_entry = ttk.Entry(folder_frame, textvariable=self.dest_var)
    dest_entry.grid(row=1, column=1, sticky="we", padx=5, pady=5)
    ttk.Button(folder_frame, text="浏览...", command=self.select_dest_folder).grid(row=1, column=2, padx=5, pady=5)

    # 文件类型筛选部分
    ttk.Label(folder_frame, text="文件类型筛选:").grid(row=2, column=0, sticky="w", padx=5, pady=5)
    type_frame = ttk.Frame(folder_frame)
    type_frame.grid(row=2, column=1, columnspan=2, sticky="w", padx=5, pady=5)

    # 创建文件类型复选框
    self.type_vars = {}
    for i, ext in enumerate(self.file_types):
        self.type_vars[ext] = tk.BooleanVar(value=True) 
        cb = ttk.Checkbutton(
            type_frame, 
            text=ext, 
            variable=self.type_vars[ext]
        )
        cb.grid(row=0, column=i, padx=5, sticky="w")

    # 全选/取消全选按钮
    ttk.Button(
        type_frame, 
        text="全选", 
        command=lambda:self.toggle_all_types(True)
    ).grid(row=0, column=len(self.file_types)+1, padx=5, sticky="w")

    ttk.Button(
        type_frame, 
        text="取消全选", 
        command=lambda:self.toggle_all_types(False)
    ).grid(row=0, column=len(self.file_types)+2, padx=5, sticky="w")
    operation_frame = ttk.LabelFrame(self.root, text="重命名操作 (可多选)", style="Bold.TLabelframe")
    operation_frame.pack(fill="x", padx=10, pady=10, ipadx=5, ipady=5)

    # 创建垂直排列的操作框架
    vertical_frame = ttk.Frame(operation_frame)
    vertical_frame.pack(fill="x", padx=5, pady=5)

    # 前缀操作组 - 垂直排列
    prefix_frame = ttk.Frame(vertical_frame)
    prefix_frame.pack(fill="x", pady=5)

    # 前缀复选框
    prefix_check = ttk.Checkbutton(
        prefix_frame, 
        text="添加前缀", 
        variable=self.prefix_enabled
    )
    prefix_check.pack(side="left", padx=(0, 10))

2.2 添加菜单

def create_menu(self):
        """创建菜单栏"""
        mainmenu = Menu(self.root)
        
        # 帮助菜单
        aboutmenu = tk.Menu(mainmenu, tearoff=False)
        aboutmenu.add_command(label="联系作者", command=self.about_command)
        mainmenu.add_cascade(label="帮助", menu=aboutmenu)

2.3 加载文件

def load_files(self):
    source = self.source_var.get()
    ifnotsource:
        return

    try:
        self.files = []
        for f in os.listdir(source):
            file_path = os.path.join(source, f)
            if os.path.isfile(file_path):
                # 检查文件扩展名是否在选中的类型中
                ext = os.path.splitext(f)[1].lower()
                if ext inself.get_selected_types():
                    self.files.append(f)

        self.status_var.set(f"找到 {len(self.files)} 个文件")
    except Exception as e:
        messagebox.showerror("错误", f"无法读取文件列表: {str(e)}")
        self.status_var.set("读取文件列表出错")

2.4 按规则执行重命名操作

def apply_rename_rules(self, filename):
    original = filename 
    order = self.order_var.get()
    if order == "前缀→后缀→替换":
        ifself.prefix_enabled.get():
            prefix = self.prefix_var.get().strip()
            filename = prefix + filename if prefix else filename

        ifself.suffix_enabled.get():
            name, ext = os.path.splitext(filename)
            suffix = self.suffix_var.get().strip()
            filename = name + suffix + ext if suffix else filename

        ifself.replace_enabled.get():
            search = self.search_var.get().strip()
            replace = self.replace_var.get().strip()
            filename = filename.replace(search, replace) if search else filename

2.5 异常提示

def execute_rename(self):
    # 检查是否有至少一个操作被选中
    ifnot any([self.prefix_enabled.get(), self.suffix_enabled.get(), self.replace_enabled.get()]):
        messagebox.showwarning("警告", "请至少选择一种重命名操作")
        return

    # 获取当前选中的文件类型
    self.selected_types = self.get_selected_types()
    ifnotself.selected_types:
        messagebox.showwarning("警告", "请至少选择一种文件类型")
        return

    source = self.source_var.get()
    destination = self.dest_var.get()

    ifnotsource:
        messagebox.showwarning("警告", "请先选择源文件夹")
        return

    ifnotdestination:
        destination = source

    # 确认操作
    ifnot messagebox.askyesno("确认", "确定要执行重命名操作吗?"):
        return

3. 更多可视化代码+数据

公众号后台回复:工具002