import os
import re
# 定义当前文件夹下文件数
filenum_original = 0
# 定义当前文件夹下word文档数
filenum_doc = 0
# 定义当前文件夹下有效word文档数
filenum_validated = 0
# 定义未找到学号人数
filenum_notfound = 0
# 定义所有文档列表
filelist_doc = []
# 定义有效文档列表
filelist_validated = []
# 定义有效文档学号列表
filelist_sno = []
# 定义未找到学号列表
filelist_notfound = []
# 定义找到学号列表
filelist_found = []
# 定义学号姓名标准字典
sjkx171 = { **这里放置学号数据** }
sjkx172 = { **这里放置学号数据** }
sjkx181 = { **这里放置学号数据** }
sjkx182 = { **这里放置学号数据** }
sjkx191 = { **这里放置学号数据** }
sjkx192 = { **这里放置学号数据** }
# 将班级字典放在列表中以遍历
class17 = {'数据科学171':sjkx171,'数据科学172':sjkx172}
class18 = {'数据科学181':sjkx181,'数据科学181':sjkx182}
class19 = {'数据科学191':sjkx191,'数据科学192':sjkx192}
# 定义临时班级字典
tempClass = {}
# 定义临时班级已交实验报告学号列表
tempClassSno_found = []
# 定义临时班级未交实验报告学号列表
tempClassSno_notfound = []
# 文档学号-班级全检索模式下使用的班级名列表
fullsearchlist = []
# 全检索模式下用于去重的集合
# fullsearchset = set()
# 函数欢迎信息输出
def printInfo():
i = 0
print("\n\t欢迎使用<点我查看谁没交实验报告>程序v1.2")
print("\t当前程序更新时间:2019年12月06日")
#print("\t作者:我不是高材生")
print("\t当前已支持统计实验报告的班级如下:\n\n")
for item in (class17,class18,class19):
for name in item.keys():
print(name,end = " \t")
i += 1
if i % 4 == 0:
print("")
print("\n\n>>>如程序内置数据缺失某人,")
print(">>>将其'姓名学号'添加至程序同目录下'checklist.txt'文件内即可。")
print(">>>每行一条数据,形如'李大钊1910203317'")
print(">>>如程序内置数据多出某人,")
print(">>>将其'0姓名学号'添加至程序同目录下'checklist.txt'文件内即可。")
print(">>>每行一条数据,形如'0李大钊1910203317'")
#函数进行获取当前文件夹下文档列表
def getFileNum():
global filenum_original
global filenum_doc
global filenum_validated
# 获取所有文件列表及个数
print("\n当前在 %s 目录下\n"%os.getcwd())
filelist_original = os.listdir()
for item in filelist_original:
filenum_original += 1
print("当前文件夹下--文件数--是:",filenum_original)
# 获取word文档列表及个数
for item in filelist_original:
if re.match(".+(\.doc|\.docx)",item):
filelist_doc.append(item)
filenum_doc += 1
print("当前文件夹下--文档数--是:",filenum_doc)
#下面这个 for 循环用于识别有效文档同时获取学号列表
for item in filelist_doc:
result = re.search("((1|2)\d{9})",item)
if result:
filelist_validated.append(item)
filelist_sno.append(result.group(1))
filenum_validated += 1
print("文件夹下--有效文档数--是:",filenum_validated,"\n")
# 函数读取checklist.txt文件
def readCheck():
try:
with open("checklist.txt","r") as file:
checkdata = file.readlines()
checkdata_length = len(checkdata)
print("\n>>>checklist.txt 文件已识别,共%d行,有效数据如下:\n"%(checkdata_length))
# checklist.txt 文件数据识别算法
if checkdata:
for item in checkdata:
# 检查如果是注释,就直接跳过
# comment = 0
if (item.strip()[0] == "#") or (item.strip()[0:2] == "//"):
# comment += 1
continue
# 正则识别1或2开头的10位学号
checkdata_line = re.search("(.+)((1|2)\d{9})",item)
# 如果有某行格式匹配失败则跳过
try:
check_name = checkdata_line.group(1).strip()
check_sno = checkdata_line.group(2)
# 调用识别班级函数获取班级名
confirmedClassName = confirmClass(check_sno)
# 文件导入数据添加删除算法(如果程序内没匹配到数据,则放入新列表)
if confirmedClassName == "没找到班级":
if item.strip()[0] == "0":
print("\t\t%s\t%s 不在程序内,无需删除"%(check_name[1:],check_sno))
else:
if check_name:
tempClass[check_sno] = check_name
print("%s\t%s\t%s 已添加"%("临时班级999",check_name,check_sno))
else:
print("\t\t必须要有名字,%s 添加失败"%check_sno)
else:
for classitem in (class17,class18,class19):
if confirmedClassName in classitem.keys():
if item.strip()[0] == "0":
del classitem[confirmedClassName][check_sno]
print("%s\t%s\t%s 已删除"%(confirmedClassName,check_name[1:],check_sno))
else:
classitem[confirmedClassName][check_sno] = check_name
print("%s\t%s\t%s 已更新"%(confirmedClassName,check_name,check_sno))
except:
#print("本行数据无效")
pass
else:
print("但checklist.txt文件为空,没有数据被添加")
except:
print("\nchecklist.txt文件识别失败或不存在")
print("没有额外数据被添加进程序")
# 进行检查实验报告上交情况
def check_doc():
# global fullsearchset
# 检索所有出现的班级,并去重
for item in filelist_sno:
fullsearchlist.append(confirmClass(item))
try:
fullsearchlist.remove("没找到班级")
except:
pass
fullsearchset = set(fullsearchlist)
for item in fullsearchset:
filelist_found = []
filelist_notfound = []
# 检查已有班级的实验报告上交情况
for classitem in (class17,class18,class19):
if item in classitem.keys():
for checksno in classitem[item].keys():
if checksno in filelist_sno:
filelist_found.append(checksno)
else:
filelist_notfound.append(checksno)
# 输出程序内置班级的交与没交情况统计(此算法有问题)
print("\n\n>>>已检索到:",item)
if len(filelist_found) > len(filelist_notfound):
for item1 in (class17,class18,class19):
if item in item1.keys():
i = 0
print(">>>@还有 %d 人没有交,他们分别是:\n"%len(filelist_notfound))
for item2 in filelist_notfound:
try:
print(item1[item][item2],end = "\t")
i += 1
if i%5 == 0:
print("")
except:
#print("error_2")
pass
else:
for item1 in (class17,class18,class19):
if item in item1.keys():
i = 0
if len(filelist_found) == 0:
print(">>>@还没有人交呢")
continue
print(">>>@已经交了 %d 个人,他们分别是:\n"%len(filelist_found))
for item2 in filelist_found:
try:
print(item1[item][item2],end = "\t")
i += 1
if i%5 == 0:
print("")
except:
#print("error_3")
pass
def check2():
# 检查文件导入列表中的人是否交了实验报告
for tempsno in tempClass.keys():
if tempsno in filelist_sno:
tempClassSno_found.append(tempsno)
else:
tempClassSno_notfound.append(tempsno)
# 输出附加班级的交与没交情况统计
if tempClass:
print("\n\n>>>已检索到:文件附加数据")
if (len(tempClassSno_found) < len(tempClassSno_notfound)):
i = 0
print(">>>@还有 %d 人没有交,他们分别是:\n"%len(tempClassSno_notfound))
for sno in tempClassSno_notfound:
try:
print(tempClass[sno],end = "\t")
i += 1
if i%5 == 0:
print("")
except:
print("error_1")
else:
i = 0
if tempClass:
if len(tempClassSno_found) == 0:
print(">>>@还没有人交呢")
else:
print(">>>@已经交了 %d 人,他们分别是:\n"%len(tempClassSno_found))
for sno in tempClassSno_found:
print(tempClass[sno],end = "\t")
i += 1
if i%5 == 0:
print("")
else:
pass
# 函数识别班级
def confirmClass(sno):
# 根据学号前两位来缩小遍历范围
if sno[0:2] == "17":
for key,value in class17.items():
if sno in value.keys():
return key
elif sno[0:2] == "18":
for key,value in class18.items():
if sno in value.keys():
return key
elif sno[0:2] == "19":
for key,value in class19.items():
if sno in value.keys():
return key
else:
pass
return "没找到班级"
# 主函数
def main():
printInfo()
readCheck()
getFileNum()
check_doc()
check2()
end = input("\n\n按下回车说拜拜")
if __name__ == '__main__':
main()