青衿之志,履践致远

简单的文件统计与重命名工具CHRE1.0

一个通过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:当有重名时会导致代码运行出错,致使失败

这里提供三种解决方法:

  1. 操作前选择备份文件(软件会提示是否备份),防止意外
  2. 提前移出重名
  3. 源文件用学号命名,进行判断时可以绕过重名

END

 

 

添加新评论