作为一个学委总是被查谁没交作业这种事所困扰,今天下午没课就打算写一个小程序帮我自动化查谁没交作业,并且根据助教的需求添加一个序号方便批改作业
刚开始想着是用java写的,因为想做个可视化窗口,但是gui都忘的差不多了,所以就想着用C++,毕竟平时打算法题用的都是C++,想着用判断子序列算法来寻找同学提交的作业名中的姓名,但是最后还是选择了python,因为里面的find函数都可以直接找出文件名中的名字,最后代码量都不到50行
但是这个用find函数也有缺陷,如果一个班里有人既有张三也有张三四,即一个人名是另一个人名的前缀的话,就会有bug,但是咱班没有
用了它,以后可以快乐地收作业了
需求
1.输出谁没交作业
2.重命名文件,添加上序号
3.导入名单的时候少数民族同学仅需要导入前半段名字即可,防止因为名字不全导致查不出人。
例:艾利希尔·里提普 需要改成艾利希尔
代码
import os
name_dic = [] #存名单
submit_name = [] #用来存已提交同学的名单
path = "C:\\Users\\alan\\Desktop\\重要文件\\20-5软件工程实验一" # 存放作业的文件夹
name_path = "D:\\0pythonProject\\findDick\\studentName" #同学名单txt文件,注意名单即为默认序号!
topic = "" #加的文件名后缀
front = "实验1-软件20-5-"#加的文件前缀名
def formate_dir(name_dic, dir_name): # 格式化文件名 name_dic->同学名字 dir_name->同学提交的文件名
for name in name_dic:
index = dir_name.find(name) #找到姓名
indes_file = dir_name.rfind(".")
if index >= 0:
submit_name.append(name) # 将提交上的同学加入名单
return front + str(d[name]) + '-' + name + topic + dir_name[indes_file:]# 输出文件的格式
return 'no_name' + dir_name
def find_not_submit(name_dic, submit_name): #看看哪位同学没有交作业
no_submmit = []
for name in name_dic:
if name not in submit_name:
no_submmit.append(name)
return no_submmit
with open(name_path ,'r', encoding='UTF-8') as lines: #读入学生姓名存入到name_dir中
for line in lines:
name_dic.append(line.strip())
fileList = os.listdir(path) #读入存放的文件
lst = [i for i in range(1, len(name_dic))] #用来存序号
d = {item:price for item, price in zip(name_dic, lst)} #建立字典,用于添加同学们的序号
for file_name in fileList:
new_name = formate_dir(name_dic, file_name) #获得格式化后的文件名
#os.rename(os.path.join(path, file_name), os.path.join(path, new_name)) 如果需要修改#文件名请开启这个代码
# 打印没有提交作业的同学的名单
result = find_not_submit(name_dic, submit_name)
print(result)
最终效果
这是收到的文件,杂乱无章
改后的文件 格式为 20-5 + 序号 + 名字 + 实验二
最终输出没交的同学