使用Python編寫批量文件重命名工具
一、前言
今天來分享一款好玩的自動化腳:批量文件重命名有時候呢,你的文件被下載下來文件名都是亂七八糟毫無規(guī)律,但是當時你下載的時候沒辦法重名或者你又不想另存為重新重命名。
比如:下載下來的照片每一個文件名字系統(tǒng)給你安排的都是系統(tǒng)自身的喜好
所以它來了,一次性完成。
二、效果

三、源碼
import os
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
from pathlib import Path
class BatchRenameApp:
def __init__(self, root):
self.root = root
self.root.title(" 批量文件重命名工具 v1.0")
self.root.geometry("800x600")
# 變量初始化
self.folder_path = tk.StringVar()
self.prefix = tk.StringVar(value="")
self.suffix = tk.StringVar(value="")
self.start_num = tk.IntVar(value=1)
self.ext_filter = tk.StringVar(value="*")
self.dry_run = tk.BooleanVar(value=False)
self.file_list = []
# 創(chuàng)建UI組件
self.create_widgets()
def create_widgets(self):
# 頂部框架 - 文件夾選擇和基本信息
top_frame = ttk.LabelFrame(self.root, text="文件夾設置", padding=(10, 5))
top_frame.pack(fill=tk.X, padx=10, pady=5)
ttk.Label(top_frame, text="目標文件夾:").grid(row=0, column=0, sticky=tk.W)
ttk.Entry(top_frame, textvariable=self.folder_path, width=50).grid(row=0, column=1, padx=5)
ttk.Button(top_frame, text="瀏覽...", command=self.browse_folder).grid(row=0, column=2)
# 中間框架 - 重命名規(guī)則設置
middle_frame = ttk.LabelFrame(self.root, text="重命名規(guī)則", padding=(10, 5))
middle_frame.pack(fill=tk.X, padx=10, pady=5)
ttk.Label(middle_frame, text="文件名前綴:").grid(row=0, column=0, sticky=tk.W)
ttk.Entry(middle_frame, textvariable=self.prefix).grid(row=0, column=1, padx=5, pady=5, sticky=tk.W)
ttk.Label(middle_frame, text="文件名后綴:").grid(row=1, column=0, sticky=tk.W)
ttk.Entry(middle_frame, textvariable=self.suffix).grid(row=1, column=1, padx=5, pady=5, sticky=tk.W)
ttk.Label(middle_frame, text="起始編號:").grid(row=2, column=0, sticky=tk.W)
ttk.Spinbox(middle_frame, textvariable=self.start_num, from_=1, to=9999).grid(row=2, column=1, padx=5, pady=5,
sticky=tk.W)
ttk.Label(middle_frame, text="文件類型:").grid(row=3, column=0, sticky=tk.W)
ttk.Entry(middle_frame, textvariable=self.ext_filter).grid(row=3, column=1, padx=5, pady=5, sticky=tk.W)
ttk.Checkbutton(middle_frame, text="僅預覽(不實際修改)", variable=self.dry_run).grid(row=4, column=0,
columnspan=2, pady=5)
# 底部框架 - 操作按鈕和文件列表
bottom_frame = ttk.Frame(self.root)
bottom_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
button_frame = ttk.Frame(bottom_frame)
button_frame.pack(fill=tk.X, pady=5)
ttk.Button(button_frame, text="掃描文件", command=self.scan_files).pack(side=tk.LEFT, padx=5)
ttk.Button(button_frame, text="預覽重命名", command=self.preview_rename).pack(side=tk.LEFT, padx=5)
ttk.Button(button_frame, text="執(zhí)行重命名", command=self.execute_rename).pack(side=tk.LEFT, padx=5)
# 文件列表樹狀視圖
self.tree = ttk.Treeview(bottom_frame, columns=("new_name", "status"), show="headings")
self.tree.heading("#0", text="原始文件名")
self.tree.heading("new_name", text="新文件名")
self.tree.heading("status", text="狀態(tài)")
vsb = ttk.Scrollbar(bottom_frame, orient="vertical", command=self.tree.yview)
hsb = ttk.Scrollbar(bottom_frame, orient="horizontal", command=self.tree.xview)
self.tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
vsb.pack(side=tk.RIGHT, fill=tk.Y)
hsb.pack(side=tk.BOTTOM, fill=tk.X)
def browse_folder(self):
folder_selected = filedialog.askdirectory()
if folder_selected:
self.folder_path.set(folder_selected)
self.scan_files()
def scan_files(self):
folder = Path(self.folder_path.get())
if not folder.exists():
messagebox.showerror(" 錯誤", "文件夾不存在!")
return
ext = self.ext_filter.get().strip()
pattern = f"*.{ext}" if ext != "*" else "*"
try:
self.file_list = sorted([f for f in folder.glob(pattern) if f.is_file() and not f.name.startswith('.')])
self.update_file_list()
messagebox.showinfo(" 完成", f"找到 {len(self.file_list)} 個文件")
except Exception as e:
messagebox.showerror(" 錯誤", f"掃描文件時出錯: {str(e)}")
def update_file_list(self):
self.tree.delete(*self.tree.get_children())
for i, file in enumerate(self.file_list, start=self.start_num.get()):
new_name = f"{self.prefix.get()}{i}{self.suffix.get()}{file.suffix}"
self.tree.insert("", tk.END, text=file.name, values=(new_name, "待處理"))
def preview_rename(self):
if not self.file_list:
messagebox.showwarning(" 警告", "請先掃描文件!")
return
self.dry_run.set(True)
self.update_file_list()
messagebox.showinfo(" 預覽", "已生成重命名預覽,請查看文件列表")
def execute_rename(self):
if not self.file_list:
messagebox.showwarning(" 警告", "請先掃描文件!")
return
if self.dry_run.get():
messagebox.showinfo(" 信息", "當前處于預覽模式,不會實際修改文件")
return
if not messagebox.askyesno(" 確認", f"確定要重命名 {len(self.file_list)} 個文件嗎?"):
return
success_count = 0
for i, file in enumerate(self.file_list, start=self.start_num.get()):
new_name = f"{self.prefix.get()}{i}{self.suffix.get()}{file.suffix}"
new_path = file.with_name(new_name)
try:
file.rename(new_path)
self.tree.item(self.tree.get_children()[i - self.start_num.get()],
values=(new_name, "成功"))
success_count += 1
except Exception as e:
self.tree.item(self.tree.get_children()[i - self.start_num.get()],
values=(new_name, f"失敗: {str(e)}"))
messagebox.showinfo(" 完成", f"操作完成!\n成功: {success_count}\n失敗: {len(self.file_list) - success_count}")
self.file_list = [] # 清空文件列表,防止重復操作
if __name__ == "__main__":
root = tk.Tk()
app = BatchRenameApp(root)
root.mainloop()
到此這篇關于使用Python編寫批量文件重命名工具的文章就介紹到這了,更多相關Python文件重命名內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
django 刪除數(shù)據(jù)庫表后重新同步的方法
今天小編就為大家分享一篇django 刪除數(shù)據(jù)庫表后重新同步的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
詳解pandas中Series()和DataFrame()的區(qū)別與聯(lián)系
本文主要介紹了詳解pandas中Series()和DataFrame()的區(qū)別與聯(lián)系,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01
Pytorch中index_select() 函數(shù)的實現(xiàn)理解
這篇文章主要介紹了Pytorch中index_select() 函數(shù)的實現(xiàn)理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
python小程序基于Jupyter實現(xiàn)天氣查詢的方法
這篇文章主要介紹了python小程序基于Jupyter實現(xiàn)天氣查詢的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
python使用django調用deepseek api搭建ai網站
DeepSeek是一家人工智能公司,致力于通過創(chuàng)新的技術和算法,推動人工智能領域的發(fā)展,本文給大家介紹了python使用django調用deepseek api搭建ai網站,文中有相關的代碼示例供大家參考,感興趣的小伙伴跟著小編一起來看看吧2025-02-02

