APP下载

教师总览性上课时间信息生成方法及其Paython实现

2020-07-24陈广智

软件导刊 2020年6期
关键词:教务管理

陈广智

摘要:郑州航院教务管理系统仅能获得单个教师课程时间信息,而要得到某个二级学院所有教师的总览性上课时间信息则需要手工合成,其过程繁琐、效率低、易出错。利用Python语言编程高效、生态开放的特点,针对郑州航院教务系统生成的某二级学院所有教师课程信息数据,提出基于xlrd与win32com.client包的自动生成二级学院所有教师总览性上课时间信息的方法。以郑州航院智能工程学院教师课程信息为例,由该方法得到的总览性上课时间信息被用于实际教务管理中,经过一学期的测试,未发现任何错误,验证了该方法的可行性与有效性。

关键词:教务管理;信息整合;总览性上课时间;Python

DOI:10.11907/rjdk.192190 开放科学(资源服务)标识码(OSID):

中图分类号:TP319文献标识码:A 文章编号:1672-7800(2020)006-0166-05

0 引言

高校二级学院教务秘书在教学管理中往往需要布置、安排一些教育教学相关任务,例如开学初补考安排、部分教师集中培训、督导专家随机听课等,由此需事先得知本院教师在该任务时间段有无教学任务,所以需要一个针对本院所有教师的总览性上课时间信息。因笔者所在学校的教务管理系统未提供该信息,仅提供了针对每个教师的课程信息,所以一直以来都是通过手工方式,根据从教务系统中导出的单个教师课程信息,合成含教师所有课程的总览性上课时间信息。该手工方法耗时长,且易出错、易遗漏。如何对从教务系统中导出的单个教师课程信息进行自动化融合、生成二级学院所有教师总览性上课时间信息,以帮助教务秘书进行教务管理是本文需要解决的问题。

Python作为一种开源、面向对象的高级脚本语言,以其易学、编程高效的特点,得到了广泛应用。因其具有强大的第三方生态库,所以在一些常见的繁琐、易出错的人工事务方面,具有开发快速及应用便利的特点。因此,本文采用Python语言进行实现。文献利用Python语言自动创建测试用例,而非将已有的单个教师课程信息自动化融合,生成总览性教师上课时间信息;文献讨论利用第三方包OpenPyXL操纵xlsx格式文件的方法,但其对Excel中单元格的读取未涉及文本分析与处理,另外其对操纵Word文件内容的讨论仅限于简单文本内容的读写,未涉及对Word中表格内容的处理;文献使用Python语言的第三方包OpenPyXL对Excel上机作业进行自动化批量批阅,并将结果汇总到一个Excel文件中,但其未涉及到Excel表格内文本的解析、抽取、融合与汇总;文献利用Python技术设计与开发一个网页版的教务管理系统,但利用其课表查询功能搜索到的上课时间信息仅面向单个学生或单个教师,不具有总览性。

针对上述问题,本文研究并提出一种从Excel文件的单个教师课程信息中抽取、融合而得到二级学院教师总览性上课时间信息的方法,并采用当前比较流行的Python语言及其第三方包xlrd与win32com.client加以实现,同时使用筛选去重策略,以保证覆盖到的所有教师课程与课程时间信息的唯一性。采用该方法得到教师总览性上课时间信息只需不到1秒,可十分方便地辅助教务管理。

1 问题描述

下面详细给出问题描述。问题的输入、输出格式部分案例如图l所示,其中图1(a)所示的Excel文件内容由郑航教务管理系统导出,图1(b)所示内容为教务秘书需要的总览性上课时间信息。

图l(a)为问题输人内容格式,为节省篇幅,只给出部分行、列信息。其中每行对应某位教师的详细课程信息,包括姓名、课程名称、上课时间、教学班及人数等。该文件用于存放全校所有教师的详细上课信息,可能包含上千條数据。图1(b)为问题输出内容格式,是经筛选后某二级学院所有教师的总览性上课时间信息。其被保存在一个Word doc文件中,内容是一个表格,其中列表示星期信息,行表示上课的节数信息。例如,“1-2”表示上午的第1、第2节课,时间范围为上午8点-9点50分,其它依此类推。除表头与行头信息外,表格内容格式为:“教师姓名+上课周次”,并且同一单元格中可以含有多个教师信息,其之间不加空格。上课周次格式为:若多周次连续,例如2、3、4,则使用格式2-4;若不连续,则用逗号分隔。由此,根据图1(b)可知,姓名为刘开的教师在本学期第3、5、7、9、10、11、12、13周的周一第9、10节有教学任务。

本文问题为:给定Excel文件中一个个单个教师的详细课程信息,设计一个二级学院总览性教师上课时间信息生成算法,该算法输出为如图l(b)所示的二级学院总览性上课时间信息表,并存放在Word文件中。

2 基于Python的总览性上课时间信息生成算法

2.1 算法依赖的数据结构

Python语言对数据结构的支持非常灵活、方便,也是本文选其为实现语言的原因之一。分析图1(b)所示表格格式,为便于在表格中相应单元格存放总览性教师上课时间信息,本文设计出如下数据结构,用于在内存中临时存储表格单元格结果:

该数据结构是一个Python字典类型(Dictionary),其元素关键字是英文的星期信息,例如“Mon”指星期一。关键字对应的值又是一个字典,该字典的关键字是上课的节次信息,其对应值为一个空字符串(String),等待着运算结果向其填充相关内容。

填充后,resDptSKinfo中结果还需转存到doc文件的表格中,为此需利用win32corn.client包(Package)先创建一个空白doc文件,再在其中创建一个包含图l(b)所示列头和行头的空白表格。因表格列与行在win32com.client中的起始索引都为1,且索引1分别被列头与行头占用,所以将resDptSKinfo中的结果转存到表格中,需从行、列索引2开始。因此,需相应的映射(Mapping)数据结构将表格中从2开始的行、列索引映射到数据结构resDptSKinfo中正确的关键字上:

上述映射结构未考虑周日的情况,因一般情况下周日无教学任务。

图1(a)的Excel表格中每个教师的“上课时间”信息需满足特定格式,即“星期数+节次+{周次}”,若同一课程在同一周其它时间段也有教学任务,则按照同样格式追加书写,中间用英文分号分隔。其中星期数按“周一、…、周日”的格式书写,节次按“第1,2节,…,第9,10节”的格式书写,周次按“{第x,xx周}”的格式书写。因存放临时结果的数据结构resDptSKinfo用英文缩写表示星期数,而上述Excel表“上课时间”列用中文表示星期数,为了使二者匹配,还需要如下数据结构:

cn2enWeek={“周一”:“MoB”,“周二”:“Tue”,“周三”:“Wed”,“周四”:“Thu”,“周五”:“Fri,“周六”:“Sat”,“周日”:“Sun”}。

2.2 总览性上课时间信息生成算法

总览性上课时间信息生成算法记为GenOvClsSchedule,如算法1所示。其输入是一个xlsx格式的Excel文件xlsxFn,具体格式与内容如图l(a)所示,用于存放全校所有教师课程任务详细信息;其输出是一个doc格式的Word文件docFn,即如图1(b)所示的学校某二级学院总览性教师上课时间信息。

算法1:总览性上课时间信息生成算法GenOvClsSchedule

输入:包含全校所有教师详细课程信息的Excel文件xlsxFn

输出:教师总览性上课时间信息doc文件docFn

1从xlsxFn文件中筛选、读取每个教师的姓名与上课时间信息,并将其分别放人列表rawData中;

2对rawData内容进行清洗,并将清洗结果放人rawData;

3foriteminrawDatado

4对item文本进行分析,提取所需的上课时间信息;

5将提取的信息存放到数据结构resDptSKinfo相应位置的值中;

6end

7创建一个doc文件docFn,并在其中创建一个如图1(b)所示格式的空白表格;

8将resDptSKinfo中内容填入文件docFn的表格中;

9Return docFn;

算法GenOvClsSchedule首先从文件xlsxFn中逐个读取教师姓名、上课时间信息,将其放人到Python列表型(List)变量rawData中。rawData中的每个元素是一个Python元组型(Tuple),格式为“(教师姓名,上课时间)”。文件xlsxFn中除教师姓名、上课时间外的其它列信息被忽略,因为其无助于生成总览性上课时间信息。关于Python语言如何从xlsx格式的Excel表中抽取相关列的信息,将在下面具体实现章节中进行详细阐述。

接着,算法要对rawData数据进行清洗:去掉冗余的表头信息、删除上课时间为空的数据元素、过滤掉非本二级学院教师的上课时间信息等。因为清洗后数据中的元素内容与图1(a)所示表中教师列、上课时间列的内容一致,也是较原始的内容,所以清洗结果仍放人同名的rawData变量中。

然后,算法3-6行对变量rawData中的元素逐个进行处理。因rawData中每个元素对应某个教师的上课时间,所以采用循环方式逐个对清洗过的每个教师上课时间信息进行文本分析(第4行),并将处理后的结果逐个放人数据结构resDptSKinfo中(第5行)。第4行具体操作为:从某个教师的上课时间信息item中分析出星期信息与上课节次信息,以确定放人到resDptSKinfo中的正确位置loc;同时将该教师姓名、上课周次信息相连接,以构造出放人位置loc的内容cot,并确保其满足输出格式;若该item中的上课时间是分号分隔的多个不同上课时间,则重复执行上述操作。由此,第5行的作用是将内容cot放人到resDptSKinfo的位置loc。

算法第7行创建一个doc文件docFn,并在该文件中创建一个如图1(b)所示格式的空白表格,以备存放相应输出内容。创建doc文件及在文件中创建表格的操作可利用Python代码自动实现,无需任何人工参与。在第7行基础上,第8行则是将resDptSKinfo中的内容填充到文件docFn的表格中。之所以不在第4-5行将相关内容直接存放到文件docFn的相应单元格中,而是存人到数据结构Yes.DptSKinfo中,是因为该方式一方面有利于模块化编程,另一方面有利于某些操作的批处理,使得文本分析与外部文件读写都能专注于各自的工作。

3 具体实现分析

3.1 开发环境设置

因实现算法GenOvClsSchedule需操纵外部Excel文件和Word文件,且Anaconda套件自带本文所需的Python第三方包,所以本文选用Anaconda套件安装Python语言开发与运行环境。Anaconda在数据科学领域使用广泛,集成了超过700个第三方库,安装与使用都很方便。从官方网站下载适合自己操作系统的安装包,根据提示一步步安装即可。安装成功后,在控制台(Console)中输人“python”,将会出现如图2所示界面。

Anaconda的版本为Anaconda35.0.1。由图2可知,安装成功后,其自带的Python版本为3.6.3。因Python向后兼容,本文算法可适用于Python 3.6.3之后的所有版本。为操纵xlsx格式的Excel文件,还需Python第三方包xlrd。Anaconda3已自带该包,版本为xlrd 1.1.0,无需额外安装。

xlrd包帮助开发者从Excel电子表格(xls或xlsx格式)中抽取所需数据。它能获取电子表格中任一工作表(Sheet)中的任一单元格(Cell)数据,支持以Python列表方式对电子表格中的整行或整列数据进行批处理。此外,为将算法结果写入doc文件,还需Python语言中有一套操作doc格式文件的方法。为此,算法实现还需包win32com.cli.ent,以便在Python程序中使用微软组件对象模型(Compo.nent Obiect Model,COM)。成功安裝Anaconda3后,该包已自动安装。

3.2 具体实现分析

算法GenOvClsSchedule所依赖的数据结构全部放到模块文件dataStruct.py中,以支持模块化编程。算法第8行的实现,即将总览性上课时间信息保存到doc格式文件的表格中,封装成函数createOutputDoc,并将其放人模块文件docOp.py中。docOp.py代码如下:

函数createOutputDoc含有两个参数:docName是用户指定的要创建的doc文件名,info是数据结构resDptSKinfo形式的总览性上课时间信息。该函数首先用win32com.cli.ent包中的Dispatch函数启动一个Word应用程序,然后用该程序创建一个doc文档,接着在该文档中创建一个6行7列的表格。代码前两个for循环分别用于在doc文件的表格中填写列头、行头信息;双重for循环用于将info中的值填人到表格相应单元格中。

下面阐述算法核心部分的实现。以下所有代码都封装在模块文件genOvClsSchedule.py中,并导人其它所需模块,代码如下:

from xlrd import open_workbook

from docOp import createOutputDoc

from dataStruct import resuhDptSKinfo,cn2enWeek,TEACH—ERS

算法GenOvClsSchedule第1行被封装成函数readXlsx.File,其仅带一个参数filename,用于指定xlsx格式的外部输入Excel文件名。该函数返回值为Python列表型变量rawData,其中元素是Python元组型。函数代码如下:

算法第2行的数据清洗功能由函数preProData实现。该函数首先去掉表头信息,然后确定rawData中的上课信息为空或非本院教师的信息项,最后删除这些信息项。函数代码如下:

在上述函数基础上,最后讨论第3-6行算法的实现。该部分功能被封装在generateDptSKinfo函数中。其仅含一个参数rawData,即前述清洗后的rawData。运算结果被存人resDptSKinfo数据结构中。代码如下:

该函数最外层for循环对列表rawData中的元素逐个进行处理;内层for循环针对某个特定教师,对其输人格式的“上课时间”(参见图l(a))信息进行文本分析,确定放人数据结构resDptSKinfo中的索引,并构造出与该索引对应的内容,最后将内容存人索引对应位置。双重循环结束后,resDptSKinfo存放完整的教师总览性上课时间信息。

4 运行结果分析

本文以郑州航院教务处官方公布的全校教师详细课程信息作为测试数据,以验证算法的可行性和有效性。文件“2017-2018-01TSK-B4.xlsx”包含真实的测试数据。使用如下代码进行集成测试,以得到所需的总览性上课时间信息:

图3是以测试数据为输入,经上述集成测试代码运算而得到的结果。为节省空间,本文只给出部分结果。

从图3可以看出,运行结果符合输出格式要求,各时间段教师教学任务占用情况一目了然。例如,周一上午,本院教师教学任务相对较少,每天的第九、十节基本无教学任务。需要注意的是,若某姓名后面跟有“10X-Y”,则意味着该姓名在整个学校内部存在重名情况,因此增加编码10加以区分,此时“X”为起始周,“Y”为终止周,含义同前述。例如,“李琳101-12”表示教师姓名为郑航智能工程学院的李琳,上课周次为第1周-第12周。该结果被转给本院教务秘书,以帮助其进行一些教务管理工作安排。经过近一个月真实场景的人工验证,未发现该运行结果具有任何错误、遗漏,教务秘书反映使用效果良好,由此验证了本文提出算法的可行性与有效性。

5 结语

通过教师总览性上课时间信息在教务秘书教学管理工作安排中的应用场景分析,本文提出一种总览性上课时间信息生成算法GenOvClsSchedule,并给出其具体开发与运行环境,分析其基于Python语言的具体实现。最后,在一个真实数据集上基于真实应用场景验证了算法的可行性和有效性。

未来算法实现还需作进一步改进,以支持旧版本xls格式的Excel输入文件和新版本docx格式的Word输出文件。此外,下一步将與教务管理系统开发人员合作,以便将本文提出的功能融合到学校的教务管理系统中。

猜你喜欢

教务管理
新形势下高校二级学院教务管理优化路径探析
有关开设跨文化课程优化教务管理的讨论