一个通过excel实现对文件的查缺和统一改名的工具,用来规范和调整收的文件。
项目名称:check and rename 1.0
记录时间:2021.11.30
Background
我认为编程的初衷就是为了解决学术或生活上一些难题或麻烦的事,根据自身的需求去定制代码,会为工作带来了极大的便利。所以在我经历了不少的的苦头后,就萌生了写这个工具的想法。
实话说,当学委太累了(经常要收作业,收作业中间又会产生很多问题),so专门花了几天时间写了这个软件,算是让自己偷个懒吧~~
同时也希望这个工具(不仅是用来收作业)能帮到更多的人(一劳永逸),毕竟谁不想偷懒呢?!!
顺便一提:版本号本来是不准备加的,但是工具的代码有漏洞和缺陷(见后文),以后闲了我会不断抽时间完善,所以加上了版本号
Target
总结一下,我认为它解决了以下的问题(帮我偷懒):
- 解决了每次收过来的作业格式乱七八糟,强迫症很难受
- 解决了每次因为缺人导致的作业收不齐
- 解决了不知道是不是有漏收作业(在对方交了的情况下)
- 解决了老师所要求的格式不符问题
- 大大减少了每次收作业的时间(不止是作业)
- 大大改善了每次收作业时影响同学之间的关系
- 大大降低了工作的出错率,提高了自己的容错率
Address
百度网盘:
链接:https://pan.baidu.com/s/1xMck-ZSodOxpcHwO4RDERw 提取码:rngi
Main code display&analysis
- 主界面实现(界面示例)
def __init__(self, parent_window):
parent_window.destroy() # 销毁主界面
self.window = tk.Tk() # 初始框的声明
self.window.title('check or rename')
self.width = 450
self.height = 330
#获取屏幕尺寸以计算布局参数,使窗口居屏幕中央
self.screenwidth = self.window.winfo_screenwidth()
self.screenheight = self.window.winfo_screenheight()
self.alignstr = '%dx%d+%d+%d' % (self.width, self.height,
(self.screenwidth-self.width)/2, (self.screenheight-self.height)/2)
self.window.geometry(self.alignstr)
self.window.resizable(width=False, height=False)
# 定义框架
self.frame_ex0 = tk.Frame(width=600, height=80)
self.frame_ex2 = tk.Frame(width=700, height=100)
self.frame_ex4 = tk.Frame(width=700, height=100)
# 定义标题
self.ex0_title = Label(self.frame_ex0, text="check&rename:", font=('Verdana', 30), fg="green")
self.ex0_title.grid()
#定义路径
self.path1 = StringVar()
self.excel = StringVar()
#查找功能
self.ex2_label = Label(self.frame_ex2, text="查找未上交:", font=('Verdana', 10), width=14)
self.ex2_button1 = ttk.Button(self.frame_ex2, text='添加文件夹',command = self.selectPath1, width=10)
self.ex2_entry1 = Entry(self.frame_ex2, textvariable = self.path1, font=('Verdana', 10), width=21)
self.ex2_button2 = ttk.Button(self.frame_ex2, text='添加Excel',command = self.selectexcel, width=10)
self.ex2_entry2 = Entry(self.frame_ex2, textvariable = self.excel, font=('Verdana', 10), width=21)
self.ex2_button3 = ttk.Button(self.frame_ex2, text='开始', command=self.docmiss_nation, width=5)
self.ex2_label.grid(row=0, column=0)
self.ex2_button1.grid(row=1, column=0)
self.ex2_entry1.grid(row=1, column=1, columnspan=3)
self.ex2_button2.grid(row=2, column=0)
self.ex2_entry2.grid(row=2, column=1, columnspan=3)
self.ex2_button3.grid(row=2, column=6, padx=15)
#改名功能
self.ex4_label = Label(self.frame_ex4, text="格式化命名:", font=('Verdana', 10), width=14)
self.ex4_button1 = ttk.Button(self.frame_ex4, text='添加文件夹',command = self.selectPath1, width=10)
self.ex4_entry1 = Entry(self.frame_ex4, textvariable = self.path1, font=('Verdana', 10), width=21)
self.ex4_button2 = ttk.Button(self.frame_ex4, text='添加Excel',command = self.selectexcel, width=10)
self.ex4_entry2 = Entry(self.frame_ex4, textvariable = self.excel, font=('Verdana', 10), width=21)
self.ex4_button3 = ttk.Button(self.frame_ex4, text='开始', command=self.raname_nation, width=5)
self.ex4_label.grid(row=0, column=0)
self.ex4_button1.grid(row=1, column=0)
self.ex4_entry1.grid(row=1, column=1, columnspan=3)
self.ex4_button2.grid(row=2, column=0)
self.ex4_entry2.grid(row=2, column=1, columnspan=3)
self.ex4_button3.grid(row=2, column=6, padx=15)
#grid方法固定框架
self.frame_ex0.grid(row=1, column=0, padx=20, pady=5)
self.frame_ex2.grid(row=2, column=0, padx=20, pady=5)
self.frame_ex4.grid(row=4, column=0, padx=20, pady=5)
self.frame_ex0.grid_propagate(0)
self.frame_ex2.grid_propagate(0)
self.frame_ex4.grid_propagate(0)
self.frame_ex0.tkraise() # 开始显示主菜单
self.frame_ex2.tkraise()
self.frame_ex4.tkraise()
self.window.mainloop() # 进入消息循环
- 查缺功能(主要算法)
path = self.path1.get()
file = self.excel.get()
wb = xlrd.open_workbook(file)
ws = wb.sheet_by_name('Sheet1')
data_name = [] #名字简写
data_stunum = [] #学号
data_fullname = [] #全名
data_total = {} #check list
for len in range(ws.nrows): #excel第一列放姓名,第二列放学号
data_name.append(ws.cell_value(len,0))
data_stunum.append(ws.cell_value(len,1))
data_fullname.append(ws.cell_value(len,2))
data_total = dict(zip(data_name, data_stunum)) #合并字典,检查名单
#pprint(data_total) #check
print('缺勤/未上交名单:')
name = os.listdir(path)
flag = 0
n = 0
temp_name = data_name[:]
temp_stunum = data_stunum[:]
temp_fullname = data_fullname[:]
for i in range(len):
temp_excel1 = temp_name.pop()
temp_excel2 = temp_stunum.pop()
temp_excel3 = temp_fullname.pop()
for temp_file in name:
if temp_excel2 in temp_file or temp_excel3 in temp_file or temp_excel1 in temp_file : #check name or stunum
flag = 1
break
else:
flag = 0
if flag == 0:
print(f"{temp_excel3} {temp_excel2}")
stuid.append(str(temp_excel2))
stuname.append(str(temp_excel1))
stufullname.append(str(temp_excel3))
n = n + 1
if n == 0:
print('无 缺勤/未上交 者')
messagebox.showinfo('完成!', '无 缺勤/未上交 者!')
- 改名功能(主要算法)
wb = xlrd.open_workbook(file)
ws = wb.sheet_by_name('Sheet1')
data_name = [] #名字简写
data_stunum = [] #学号
data_fullname = [] #全名
data_total = {} #check list
form = self.e2.get()
selfdef = self.e3.get()
for len in range(ws.nrows): #excel第一列放姓名,第二列放学号
data_name.append(ws.cell_value(len,0))
data_stunum.append(ws.cell_value(len,1))
data_fullname.append(ws.cell_value(len,2))
data_total = dict(zip(data_name, data_stunum)) #合并字典,检查名单
#pprint(data_total) #check
temp_name = data_name[:]
temp_stunum = data_stunum[:]
temp_fullname = data_fullname[:]
print("如果需要文件重命名,请选择命名格式:\n班级可自行输入:\n")
switch = {'1':'姓名学号:张三20201305999','2':'姓名+学号:张三+20201305999','3':'姓名-学号:张三-20201305999',
'4':'班级姓名:信安20-3张三','5':'姓名学号:张三20201305999(名字简写)',
'6':'姓名+学号:张三+20201305999(名字简写)','7':'姓名-学号:张三-20201305999(名字简写)',
'8':'班级姓名:信安20-3张三(名字简写)','9':'姓名:张三','0':'学号:20201305999'}
if self.select == 4 or self.select == 8:
print('请输入班级:(例 信安20-3)')
classes = self.e1.get()
name = os.listdir(path)
#pprint(name) #check
for i in range(len):
temp_excel1 = temp_name.pop()
temp_excel2 = temp_stunum.pop()
temp_excel3 = temp_fullname.pop()
if self.select == 1:
tnew_file = f"{temp_excel3}{temp_excel2}" #张三20201305999
elif self.select == 2:
tnew_file = f"{temp_excel3}+{temp_excel2}" #张三+20201305999
elif self.select == 3:
tnew_file = f"{temp_excel3}-{temp_excel2}" #张三-20201305999
elif self.select == 4:
tnew_file = f"{classes}{temp_excel3}" #信安20-3张三
elif self.select == 5:
tnew_file = f"{temp_excel1}{temp_excel2}" #张三(简写)20201305999
elif self.select == 6:
tnew_file = f"{temp_excel1}+{temp_excel2}" #张三(简写)+20201305999
elif self.select == 7:
tnew_file = f"{temp_excel1}-{temp_excel2}" #张三(简写)-20201305999
elif self.select == 8:
tnew_file = f"{classes}{temp_excel1}" #信安20-3张三(简写)
elif self.select == 9:
tnew_file = f"{temp_excel3}" #张三
elif self.select == 0:
tnew_file = f"{temp_excel2}" #20201305999
elif self.select == 10:
if selfdef != '':
new1 = selfdef.replace("{fname}",temp_excel3)
new2 = new1.replace("{sname}",temp_excel1)
new3 = new2.replace("{num}",temp_excel2)
print(new3)
tnew_file = new3
else:
messagebox.showinfo('警告!', '自定义为空')
for temp_file in name: ##############这里选择这种写法是为了水代码行,懒得修改了,见谅################
if '.zip' in temp_file:
new_file = f"{tnew_file}.zip" #判断源文件的格式并保留,只写了常用格式
elif '.jpg' in temp_file:
new_file = f"{tnew_file}.jpg"
elif '.jpeg' in temp_file:
new_file = f"{tnew_file}.jpeg"
elif '.docx' in temp_file:
new_file = f"{tnew_file}.docx"
elif '.rar' in temp_file:
new_file = f"{tnew_file}.rar"
elif '.7z' in temp_file:
new_file = f"{tnew_file}.7z"
elif '.xlsx' in temp_file:
new_file = f"{tnew_file}.xlsx"
elif '.xls' in temp_file:
new_file = f"{tnew_file}.xls"
elif '.c' in temp_file:
new_file = f"{tnew_file}.c"
elif '.cpp' in temp_file:
new_file = f"{tnew_file}.cpp"
elif '.py' in temp_file:
new_file = f"{tnew_file}.py"
elif '.java' in temp_file:
new_file = f"{tnew_file}.java"
elif '.txt' in temp_file:
new_file = f"{tnew_file}.txt"
elif '.rtf' in temp_file:
new_file = f"{tnew_file}.rtf"
elif '.ppt' in temp_file:
new_file = f"{tnew_file}.ppt"
elif '.img' in temp_file:
new_file = f"{tnew_file}.img"
elif '.doc' in temp_file:
new_file = f"{tnew_file}.doc"
elif '.png/f4nq1e' in temp_file:
new_file = f"{tnew_file}.png/f4nq1e"
else: new_file = f"{tnew_file}{form}"
if temp_excel2 in temp_file or temp_excel3 in temp_file or temp_excel1 in temp_file :
os.chdir(path)
os.rename(temp_file,new_file)
break
Instructions
由于工具过于简单,参考下面的截图即可(Running screenshot)
若有使用上的其他问题,请留言!
Running screenshot
1.主界面运行图
2.查找结果运行图
略
3.格式化命名界面运行图
4.格式化命名自定义填法示例:均不是必填项
5.备份确认图
6.修改确认图
Excel config
Excel配置说明:
- Excel第一行为预留列名,所以第一行不要放信息(空着就行)
- 第一列(A列) 放名字简称
- 第二列(B列) 放学号,注意学号前面加上
'
,例如:'20201100110
- 第三列(C列) 放名字全称,用
·
Excel图例:
Update log
日志记录了该工具各个版本的更新和坎坷历程,由于忘了日期,我就大概一记,您就看个乐呵吧hhh
v0.0.1
- 完成了查找功能
v0.0.2
- 完成了改名功能
- 完善了查找功能
v0.0.3
- 测试出了bug,找到了替代方法,但并没有完全修复
v0.0.4
- 改进excel表格,减少了部分无关代码
v0.0.5
- 区分了民族学生的名字简和全称,区分了民汉
- 修改了两个功能的代码
v0.0.6
- 改变了工具的定位方向
- 增加了文件查找功能
v0.1.0
- 扩展了巨多功能(不介绍了)
v0.2.0-0.8.8
- 无关功能修改
v0.9.0
- 增加了图像化GUI界面,完善了所有功能的图像化操作
v0.9.2
- 剥离了其他功能,单独取出了查缺和重命名功能
- 为其制作了新的GUI界面
v0.9.4
- 增加了自定义班级输入功能
v0.9.6
- 增加了格式强制修改功能
- 提供了文件备份选项
v0.9.8
- 增加了自定义格式功能
- 优化上一版本
v1.0.0
- 对所有功能进行了检测
- 优化了部分代码
- 确定了新的改善方向
Short&Bug
经过测试,软件还有bug没有修复,不过大部分情况都可正常使用。
并且在改格式前可以提供备份选项,建议备份以防出错!
请自检名单是否有下列情况:
下面列出已知bug:
- 重名bug:当有重名时会导致代码运行出错,致使失败
这里提供三种解决方法:
- 操作前选择备份文件(软件会提示是否备份),防止意外
- 提前移出重名
- 源文件用学号命名,进行判断时可以绕过重名
END