同事要求 的。
使用方法 :从平台上导出数据,最后删除无用的格式内容,保存成如图即可。
相片以班或校为单位,给学生照相,顺序和电子表格一致。不能少也不能多。
改名之后,一定要把照片文件夹 备份一下。
准备好了之后,打开软件,如下:
从图上就可以看出来。不用过多介绍。
代码如下:
import os
import pandas as pd
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
from PIL import Image
class RenameTool:
def __init__(self, root):
self.root = root
self.root.title("学籍照片重命名工具")
self.student_ids = []
self.image_folder = ""
self.excel_path = ""
# 创建界面组件
self.create_widgets()
def create_widgets(self):
# 按钮框架
btn_frame = ttk.Frame(self.root)
btn_frame.pack(pady=10)
# Excel按钮
ttk.Button(btn_frame, text="打开电子表格", command=self.load_excel).grid(row=0, column=0, padx=5)
# 文件夹按钮
ttk.Button(btn_frame, text="选择图片文件夹", command=self.select_folder).grid(row=0, column=1, padx=5)
# 重命名按钮
ttk.Button(btn_frame, text="开始重命名", command=self.start_rename).grid(row=0, column=2, padx=5)
# 学籍号列表
self.tree = ttk.Treeview(self.root, columns=('省学籍辅号'), show='headings')
self.tree.heading('省学籍辅号', text='学籍号列表')
self.tree.column('省学籍辅号', width=300, anchor='center')
self.tree.pack(pady=10)
# 状态栏
self.status = ttk.Label(self.root, text="杜宜城作品,欢迎使用...", relief=tk.SUNKEN, anchor=tk.W)
self.status.pack(side=tk.BOTTOM, fill=tk.X)
def load_excel(self):
file_path = filedialog.askopenfilename(
filetypes=[("Excel文件", "*.xlsx"), ("All Files", "*.*")]
)
if file_path:
try:
df = pd.read_excel(file_path, dtype={'省学籍辅号': str})
if '省学籍辅号' not in df.columns:
messagebox.showerror("错误", "Excel中未找到'省学籍辅号'列")
return
self.student_ids = df['省学籍辅号'].tolist()
self.excel_path = file_path
self.update_treeview()
self.update_status(f"已加载Excel文件:{file_path}")
except Exception as e:
messagebox.showerror("错误", f"读取Excel文件失败:{str(e)}")
def select_folder(self):
folder_path = filedialog.askdirectory()
if folder_path:
self.image_folder = folder_path
self.update_status(f"已选择图片文件夹:{folder_path}")
def start_rename(self):
if not self.excel_path:
messagebox.showwarning("警告", "请先选择电子表格文件")
return
if not self.image_folder:
messagebox.showwarning("警告", "请先选择图片文件夹")
return
# 获取图片文件列表
try:
image_files = [f for f in os.listdir(self.image_folder)
if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
image_files.sort() # 按文件名排序
except Exception as e:
messagebox.showerror("错误", f"读取图片文件失败:{str(e)}")
return
# 数量校验
if len(image_files) != len(self.student_ids):
messagebox.showerror("错误",
f"图片数量({len(image_files)})与学籍号数量({len(self.student_ids)})不一致!")
return
# 执行重命名
success_count = 0
for idx, (old_name, student_id) in enumerate(zip(image_files, self.student_ids)):
try:
ext = os.path.splitext(old_name)[1]
new_name = f"{student_id}{ext}"
old_path = os.path.join(self.image_folder, old_name)
new_path = os.path.join(self.image_folder, new_name)
os.rename(old_path, new_path)
success_count += 1
except Exception as e:
messagebox.showerror("错误",
f"重命名 {old_name} 失败:{str(e)}")
return
messagebox.showinfo("完成",
f"重命名完成!成功处理 {success_count}/{len(image_files)} 个文件")
self.update_status("重命名操作完成")
def update_treeview(self):
self.tree.delete(*self.tree.get_children())
for sid in self.student_ids:
self.tree.insert('', 'end', values=(sid,))
def update_status(self, message):
self.status.config(text=message)
if __name__ == "__main__":
root = tk.Tk()
app = RenameTool(root)
root.mainloop()
根据代码,自己可以本地运行,也可以打包成exe.不明白的可以留言。成品,我看给不给上传。