话说实验报告每天都要查人数,何不用程序实现

使用 python 查看谁没有交作业

version 1.0

程序嘛,肯定是可以改进的。使用该程序的前提是实验报告文件名中包含学号信息。将以上程序放在实验报告所在目录,双击即可显示谁没交。

程序大致的流程是:
1、将本班学号姓名数据放在字典中
2、使用正则过滤出包含有学号数据的有效文档名放在列表中
3、正则提取有效列表名中的学号与标准字典对比
4、对比出的差值就是没有交作业的

import os
import re#定义学号姓名标准字典
namedata = {*这里用来放置'学号':'姓名'字典数据*}
#定义当前文件夹下文件数
filenum_original = -1
#定义当前文件夹下文档数
filenum_doc = 0
#定义当前文件夹下有效文档数
filenum_validated = 0
#定义未找到学号人数
filenum_notfound = 0
#定义所有文档列表
filelist_doc = []
#定义有效文档列表
filelist_validated = []
#定义有效文档学号列表
filelist_sno = []
#定义未找到学号列表
filelist_notfound = []#进行获取当前文件夹下文档列表
print("当前在 %s 目录下\n"%os.getcwd())
filelist_original = os.listdir()
for item in filelist_original:filenum_original += 1
print("当前文件夹下--文件数--是:",filenum_original)
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:
#这里用来查找文件名中10位数字的学号result = re.search("(18\d{8})",item)if result:filelist_validated.append(item)filelist_sno.append(result.group(1))filenum_validated += 1
print("文件夹下--有效文档数--是:",filenum_validated,"\n")#将得到的数据与标准字典进行对比
for item in namedata.keys():if item in filelist_sno:passelse:filenum_notfound += 1filelist_notfound.append(namedata[item])#输出结果
print("本班*这里根据实际情况填写*人,共计 %d 人没有交实验报告"%filenum_notfound,end=",")
print("他们分别是:\n")
num = 0
for item in filelist_notfound:num +=1print(item,end="\t")
#每 5 个名字换一行if num % 5 == 0:print("")
#实现输出完结果停留在当前页面
key = input("\n\n按回车键继续")

进阶版,支持多个班级和自定义

如果程序只支持一个班级的话,好用是好用,就是有点鸡肋。现在将其扩展一下,程序内置数据支持多个班级。

后来想想,即使支持了多个班级,也都是硬编码到了程序里面,是写死的。依然会有一些不便。那好,咱干脆同时支持手动扩展得了。使用外置文件进行添加数据扩展,程序运行时读取数据进行增删。当然,程序稍做改动还可实现白名单的功能,就是不管其交没交都不在结果中显示他

version 1.2

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 = 0print("\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 += 1if i % 4 == 0:print("")print("\n\n>>>如程序内置数据缺失某人,")print(">>>将其'姓名学号'添加至程序同目录下'checklist.txt'文件内即可。")print(">>>每行一条数据,形如'李大钊1910203317'")print(">>>如程序内置数据多出某人,")print(">>>将其'0姓名学号'添加至程序同目录下'checklist.txt'文件内即可。")print(">>>每行一条数据,形如'0李大钊1910203317'")#函数进行获取当前文件夹下文档列表
def getFileNum():global filenum_originalglobal filenum_docglobal filenum_validated# 获取所有文件列表及个数print("\n当前在 %s 目录下\n"%os.getcwd())filelist_original = os.listdir()for item in filelist_original:filenum_original += 1print("当前文件夹下--文件数--是:",filenum_original)# 获取word文档列表及个数for item in filelist_original:if re.match(".+(\.doc|\.docx)",item):filelist_doc.append(item)filenum_doc += 1print("当前文件夹下--文档数--是:",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 += 1print("文件夹下--有效文档数--是:",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 = 0if (item.strip()[0] == "#") or (item.strip()[0:2] == "//"):# comment += 1continue# 正则识别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_nameprint("%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_nameprint("%s\t%s\t%s 已更新"%(confirmedClassName,check_name,check_sno))                  except:#print("本行数据无效")passelse: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:passfullsearchset = 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 = 0print(">>>@还有 %d 人没有交,他们分别是:\n"%len(filelist_notfound))for item2 in filelist_notfound:try:print(item1[item][item2],end = "\t")i += 1if i%5 == 0:print("")except:#print("error_2")passelse:for item1 in (class17,class18,class19):if item in item1.keys():i = 0if len(filelist_found) == 0:print(">>>@还没有人交呢")continueprint(">>>@已经交了 %d 个人,他们分别是:\n"%len(filelist_found))for item2 in filelist_found:try:print(item1[item][item2],end = "\t")i += 1if 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 = 0print(">>>@还有 %d 人没有交,他们分别是:\n"%len(tempClassSno_notfound))for sno in tempClassSno_notfound:try:print(tempClass[sno],end = "\t")i += 1if i%5 == 0:print("")except:print("error_1")else:i = 0if 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 += 1if 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 keyelif sno[0:2] == "18":for key,value in class18.items():if sno in value.keys():return keyelif sno[0:2] == "19":for key,value in class19.items():if sno in value.keys():return keyelse:passreturn "没找到班级"
# 主函数
def main():printInfo()readCheck()getFileNum()check_doc()check2()end = input("\n\n按下回车说拜拜")if __name__ == '__main__':main()

运行效果如下图:
(运行环境:只在配置文件中加了李大钊的数据,没有放置实验报告)

说明
程序实现了以下功能:
1、自动识别当前文件夹下有效文档所属班级,并统计本班报告上交信息。
2、交的多,显示没交的;没交的多,显示交的。
3、支持外部数据扩展,作为一个班进行统计。
4、支持白名单,配置文件checklist.txt加入姓名学号,并在行首加0即可。

程序有以下问题:
1、如果程序执行过程中遇到异常会直接跳过,并且没有提示。
2、程序仅在检测到文件名中1或2开头的10位学号才会认为文档有效。
3、程序不检测异常文件大小。
4、程序没有保存日志文件。

使用 python 查看谁没有交作业相关推荐

  1. python实现自动化查谁没交作业

    作为一个学委总是被查谁没交作业这种事所困扰,今天下午没课就打算写一个小程序帮我自动化查谁没交作业,并且根据助教的需求添加一个序号方便批改作业 ​刚开始想着是用java写的,因为想做个可视化窗口,但是g ...

  2. python 字典练习 记录学生是否交作业的小程序

    #记录学生是否交作业的小程序 #包括:学生名字.日期.状态 1 data={ 2 'taotao':{ 3 '2018-6-3':'已交', 4 '2018-6-4':'未交', 5 '2018-6- ...

  3. 用python检查班上同学交作业的情况

    当你作为班干时,收电子档的作业会让你十分的烦恼 不是这个鬼仔没交就是那个没交,为了解决这个烦恼 便有了下面的代码 import os import regz = ['小明', '小陈', '小东'] ...

  4. 怎么上传云班课的计算机作业,云班课怎么交作业_云班课作业提交教程_3DM手游...

    是如何在云班课平台中提交作业?很多小伙伴还不太清楚.云班课平台中提交作业的类型有很多中,提交方式也有所不同.下面小编来为大家介绍一下云班课提交作业的详细方法教程,一起来看看. 云班课怎么交作业? 老师 ...

  5. 学生交作业,现在都流行用二维码了

    因为疫情影响,加之二维码应用的普及,学生们使用二维码来交作业已经是非常普遍的现象了.作为重要的内容传播媒介,二维码不仅能直接连接至网址,还能够同时展示多个文件.图片.文章.视频.音频. 下面我们就来详 ...

  6. 【Python】大数据挖掘课程作业1——使用爬虫爬取B站评论、弹幕与UP主的投稿视频列表

    [Python]大数据挖掘课程作业1--使用爬虫爬取B站评论.弹幕与UP主的投稿视频列表 数据挖掘部分的基本目标是:对于指定的UP主,能够获取其投稿视频列表:对于指定的视频,能够获取其视频标签.评论( ...

  7. python查看环境路径

    在pycharm或者jupter中查看python路径: import syspaths=sys.pathfor path_m in paths:if "python" in pa ...

  8. python 如何查看模块所有方法-Python查看模块函数,查看函数方法的详细信息

    Python查看方法的详情 1.通用的帮助函数help() 使用help()函数来查看函数的帮助信息. 如: 1 importrequests2 3 help(requests) 会有类似如下输出: ...

  9. python 查看网络模型

    python 查看网络模型 if __name__ == '__main__':import torchimport torchvision.models as modelsfrom torchsum ...

最新文章

  1. 有哪些好用的远程办公软件推荐?
  2. 建立与ftp服务器的连接——完成版(java)
  3. python变量类型-Python-变量类型
  4. 【boundfield】GridView中BoundField与TemplateField的区别_boundfield
  5. LWIP源码结构分析
  6. 深入php内核一(概述)
  7. 机器学习-分类算法-模型的保存和加载12
  8. 如何激活React的跟踪模式和打开日志记录
  9. java循环结构教程
  10. 程序员常去的103个网站(转)
  11. 敏友的【敏捷个人】有感(6): 我的改变从执行力分享开始
  12. PostgreSQL的执行计划分析
  13. ps cs6导出html,渲染视频使用不了是怎么回事?pscs6ex – 手机爱问
  14. ASP.NET JS常用方法类
  15. mac win7 计算机,详解mac如何安装win7
  16. DES对称加密算法详解和c++代码实现(带样例和详细的中间数据)
  17. Oracle 获取汉字拼音首字母
  18. 【涡动协方差及能量平衡系统】
  19. 译文 [ROM][多国语言][2015.06.11] Lenovo S750 (MTK6589) - andrea_d86-lenovos750-4.2.2
  20. Apple苹果EDI案例

热门文章

  1. java-Map接口
  2. 【记录】我的一个Centos开机自启动脚本的制作
  3. 【夜读】做好这6件事,让人受益一生
  4. 11月第2周业务风控关注|36名利用网络刷单实施诈骗的犯罪嫌疑人从菲律宾被押解回国
  5. define _WINSOCK_DEPRECATED_NO_WARNINGS
  6. selenium实现模拟点击QQ一键登录
  7. 智能车入门——元素识别与循迹
  8. 开启微信公众号定位服务器,微信公众号的定位是怎样的?
  9. 以“实景+科幻三维建模渲染”,助力“实景三维中国建设”
  10. 详解 yolo配置文件各参数的含义