陳廣智
摘要:鄭州航院教務管理系統(tǒng)僅能獲得單個教師課程時間信息,而要得到某個二級學院所有教師的總覽性上課時間信息則需要手工合成,其過程繁瑣、效率低、易出錯。利用Python語言編程高效、生態(tài)開放的特點,針對鄭州航院教務系統(tǒng)生成的某二級學院所有教師課程信息數(shù)據(jù),提出基于xlrd與win32com.client包的自動生成二級學院所有教師總覽性上課時間信息的方法。以鄭州航院智能工程學院教師課程信息為例,由該方法得到的總覽性上課時間信息被用于實際教務管理中,經(jīng)過一學期的測試,未發(fā)現(xiàn)任何錯誤,驗證了該方法的可行性與有效性。
關鍵詞:教務管理;信息整合;總覽性上課時間;Python
DOI:10.11907/rjdk.192190 開放科學(資源服務)標識碼(OSID):
中圖分類號:TP319文獻標識碼:A 文章編號:1672-7800(2020)006-0166-05
0 引言
高校二級學院教務秘書在教學管理中往往需要布置、安排一些教育教學相關任務,例如開學初補考安排、部分教師集中培訓、督導專家隨機聽課等,由此需事先得知本院教師在該任務時間段有無教學任務,所以需要一個針對本院所有教師的總覽性上課時間信息。因筆者所在學校的教務管理系統(tǒng)未提供該信息,僅提供了針對每個教師的課程信息,所以一直以來都是通過手工方式,根據(jù)從教務系統(tǒng)中導出的單個教師課程信息,合成含教師所有課程的總覽性上課時間信息。該手工方法耗時長,且易出錯、易遺漏。如何對從教務系統(tǒng)中導出的單個教師課程信息進行自動化融合、生成二級學院所有教師總覽性上課時間信息,以幫助教務秘書進行教務管理是本文需要解決的問題。
Python作為一種開源、面向對象的高級腳本語言,以其易學、編程高效的特點,得到了廣泛應用。因其具有強大的第三方生態(tài)庫,所以在一些常見的繁瑣、易出錯的人工事務方面,具有開發(fā)快速及應用便利的特點。因此,本文采用Python語言進行實現(xiàn)。文獻利用Python語言自動創(chuàng)建測試用例,而非將已有的單個教師課程信息自動化融合,生成總覽性教師上課時間信息;文獻討論利用第三方包OpenPyXL操縱xlsx格式文件的方法,但其對Excel中單元格的讀取未涉及文本分析與處理,另外其對操縱Word文件內容的討論僅限于簡單文本內容的讀寫,未涉及對Word中表格內容的處理;文獻使用Python語言的第三方包OpenPyXL對Excel上機作業(yè)進行自動化批量批閱,并將結果匯總到一個Excel文件中,但其未涉及到Excel表格內文本的解析、抽取、融合與匯總;文獻利用Python技術設計與開發(fā)一個網(wǎng)頁版的教務管理系統(tǒng),但利用其課表查詢功能搜索到的上課時間信息僅面向單個學生或單個教師,不具有總覽性。
針對上述問題,本文研究并提出一種從Excel文件的單個教師課程信息中抽取、融合而得到二級學院教師總覽性上課時間信息的方法,并采用當前比較流行的Python語言及其第三方包xlrd與win32com.client加以實現(xiàn),同時使用篩選去重策略,以保證覆蓋到的所有教師課程與課程時間信息的唯一性。采用該方法得到教師總覽性上課時間信息只需不到1秒,可十分方便地輔助教務管理。
1 問題描述
下面詳細給出問題描述。問題的輸入、輸出格式部分案例如圖l所示,其中圖1(a)所示的Excel文件內容由鄭航教務管理系統(tǒng)導出,圖1(b)所示內容為教務秘書需要的總覽性上課時間信息。
圖l(a)為問題輸人內容格式,為節(jié)省篇幅,只給出部分行、列信息。其中每行對應某位教師的詳細課程信息,包括姓名、課程名稱、上課時間、教學班及人數(shù)等。該文件用于存放全校所有教師的詳細上課信息,可能包含上千條數(shù)據(jù)。圖1(b)為問題輸出內容格式,是經(jīng)篩選后某二級學院所有教師的總覽性上課時間信息。其被保存在一個Word doc文件中,內容是一個表格,其中列表示星期信息,行表示上課的節(jié)數(shù)信息。例如,“1-2”表示上午的第1、第2節(jié)課,時間范圍為上午8點-9點50分,其它依此類推。除表頭與行頭信息外,表格內容格式為:“教師姓名+上課周次”,并且同一單元格中可以含有多個教師信息,其之間不加空格。上課周次格式為:若多周次連續(xù),例如2、3、4,則使用格式2-4;若不連續(xù),則用逗號分隔。由此,根據(jù)圖1(b)可知,姓名為劉開的教師在本學期第3、5、7、9、10、11、12、13周的周一第9、10節(jié)有教學任務。
本文問題為:給定Excel文件中一個個單個教師的詳細課程信息,設計一個二級學院總覽性教師上課時間信息生成算法,該算法輸出為如圖l(b)所示的二級學院總覽性上課時間信息表,并存放在Word文件中。
2 基于Python的總覽性上課時間信息生成算法
2.1 算法依賴的數(shù)據(jù)結構
Python語言對數(shù)據(jù)結構的支持非常靈活、方便,也是本文選其為實現(xiàn)語言的原因之一。分析圖1(b)所示表格格式,為便于在表格中相應單元格存放總覽性教師上課時間信息,本文設計出如下數(shù)據(jù)結構,用于在內存中臨時存儲表格單元格結果:
該數(shù)據(jù)結構是一個Python字典類型(Dictionary),其元素關鍵字是英文的星期信息,例如“Mon”指星期一。關鍵字對應的值又是一個字典,該字典的關鍵字是上課的節(jié)次信息,其對應值為一個空字符串(String),等待著運算結果向其填充相關內容。
填充后,resDptSKinfo中結果還需轉存到doc文件的表格中,為此需利用win32corn.client包(Package)先創(chuàng)建一個空白doc文件,再在其中創(chuàng)建一個包含圖l(b)所示列頭和行頭的空白表格。因表格列與行在win32com.client中的起始索引都為1,且索引1分別被列頭與行頭占用,所以將resDptSKinfo中的結果轉存到表格中,需從行、列索引2開始。因此,需相應的映射(Mapping)數(shù)據(jù)結構將表格中從2開始的行、列索引映射到數(shù)據(jù)結構resDptSKinfo中正確的關鍵字上:
上述映射結構未考慮周日的情況,因一般情況下周日無教學任務。
圖1(a)的Excel表格中每個教師的“上課時間”信息需滿足特定格式,即“星期數(shù)+節(jié)次+{周次}”,若同一課程在同一周其它時間段也有教學任務,則按照同樣格式追加書寫,中間用英文分號分隔。其中星期數(shù)按“周一、…、周日”的格式書寫,節(jié)次按“第1,2節(jié),…,第9,10節(jié)”的格式書寫,周次按“{第x,xx周}”的格式書寫。因存放臨時結果的數(shù)據(jù)結構resDptSKinfo用英文縮寫表示星期數(shù),而上述Excel表“上課時間”列用中文表示星期數(shù),為了使二者匹配,還需要如下數(shù)據(jù)結構:
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將提取的信息存放到數(shù)據(jù)結構resDptSKinfo相應位置的值中;
6end
7創(chuàng)建一個doc文件docFn,并在其中創(chuàng)建一個如圖1(b)所示格式的空白表格;
8將resDptSKinfo中內容填入文件docFn的表格中;
9Return docFn;
算法GenOvClsSchedule首先從文件xlsxFn中逐個讀取教師姓名、上課時間信息,將其放人到Python列表型(List)變量rawData中。rawData中的每個元素是一個Python元組型(Tuple),格式為“(教師姓名,上課時間)”。文件xlsxFn中除教師姓名、上課時間外的其它列信息被忽略,因為其無助于生成總覽性上課時間信息。關于Python語言如何從xlsx格式的Excel表中抽取相關列的信息,將在下面具體實現(xiàn)章節(jié)中進行詳細闡述。
接著,算法要對rawData數(shù)據(jù)進行清洗:去掉冗余的表頭信息、刪除上課時間為空的數(shù)據(jù)元素、過濾掉非本二級學院教師的上課時間信息等。因為清洗后數(shù)據(jù)中的元素內容與圖1(a)所示表中教師列、上課時間列的內容一致,也是較原始的內容,所以清洗結果仍放人同名的rawData變量中。
然后,算法3-6行對變量rawData中的元素逐個進行處理。因rawData中每個元素對應某個教師的上課時間,所以采用循環(huán)方式逐個對清洗過的每個教師上課時間信息進行文本分析(第4行),并將處理后的結果逐個放人數(shù)據(jù)結構resDptSKinfo中(第5行)。第4行具體操作為:從某個教師的上課時間信息item中分析出星期信息與上課節(jié)次信息,以確定放人到resDptSKinfo中的正確位置loc;同時將該教師姓名、上課周次信息相連接,以構造出放人位置loc的內容cot,并確保其滿足輸出格式;若該item中的上課時間是分號分隔的多個不同上課時間,則重復執(zhí)行上述操作。由此,第5行的作用是將內容cot放人到resDptSKinfo的位置loc。
算法第7行創(chuàng)建一個doc文件docFn,并在該文件中創(chuàng)建一個如圖1(b)所示格式的空白表格,以備存放相應輸出內容。創(chuàng)建doc文件及在文件中創(chuàng)建表格的操作可利用Python代碼自動實現(xiàn),無需任何人工參與。在第7行基礎上,第8行則是將resDptSKinfo中的內容填充到文件docFn的表格中。之所以不在第4-5行將相關內容直接存放到文件docFn的相應單元格中,而是存人到數(shù)據(jù)結構Yes.DptSKinfo中,是因為該方式一方面有利于模塊化編程,另一方面有利于某些操作的批處理,使得文本分析與外部文件讀寫都能專注于各自的工作。
3 具體實現(xiàn)分析
3.1 開發(fā)環(huán)境設置
因實現(xiàn)算法GenOvClsSchedule需操縱外部Excel文件和Word文件,且Anaconda套件自帶本文所需的Python第三方包,所以本文選用Anaconda套件安裝Python語言開發(fā)與運行環(huán)境。Anaconda在數(shù)據(jù)科學領域使用廣泛,集成了超過700個第三方庫,安裝與使用都很方便。從官方網(wǎng)站下載適合自己操作系統(tǒng)的安裝包,根據(jù)提示一步步安裝即可。安裝成功后,在控制臺(Console)中輸人“python”,將會出現(xiàn)如圖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包幫助開發(fā)者從Excel電子表格(xls或xlsx格式)中抽取所需數(shù)據(jù)。它能獲取電子表格中任一工作表(Sheet)中的任一單元格(Cell)數(shù)據(jù),支持以Python列表方式對電子表格中的整行或整列數(shù)據(jù)進行批處理。此外,為將算法結果寫入doc文件,還需Python語言中有一套操作doc格式文件的方法。為此,算法實現(xiàn)還需包win32com.cli.ent,以便在Python程序中使用微軟組件對象模型(Compo.nent Obiect Model,COM)。成功安裝Anaconda3后,該包已自動安裝。
3.2 具體實現(xiàn)分析
算法GenOvClsSchedule所依賴的數(shù)據(jù)結構全部放到模塊文件dataStruct.py中,以支持模塊化編程。算法第8行的實現(xiàn),即將總覽性上課時間信息保存到doc格式文件的表格中,封裝成函數(shù)createOutputDoc,并將其放人模塊文件docOp.py中。docOp.py代碼如下:
函數(shù)createOutputDoc含有兩個參數(shù):docName是用戶指定的要創(chuàng)建的doc文件名,info是數(shù)據(jù)結構resDptSKinfo形式的總覽性上課時間信息。該函數(shù)首先用win32com.cli.ent包中的Dispatch函數(shù)啟動一個Word應用程序,然后用該程序創(chuàng)建一個doc文檔,接著在該文檔中創(chuàng)建一個6行7列的表格。代碼前兩個for循環(huán)分別用于在doc文件的表格中填寫列頭、行頭信息;雙重for循環(huán)用于將info中的值填人到表格相應單元格中。
下面闡述算法核心部分的實現(xiàn)。以下所有代碼都封裝在模塊文件genOvClsSchedule.py中,并導人其它所需模塊,代碼如下:
from xlrd import open_workbook
from docOp import createOutputDoc
from dataStruct import resuhDptSKinfo,cn2enWeek,TEACH—ERS
算法GenOvClsSchedule第1行被封裝成函數(shù)readXlsx.File,其僅帶一個參數(shù)filename,用于指定xlsx格式的外部輸入Excel文件名。該函數(shù)返回值為Python列表型變量rawData,其中元素是Python元組型。函數(shù)代碼如下:
算法第2行的數(shù)據(jù)清洗功能由函數(shù)preProData實現(xiàn)。該函數(shù)首先去掉表頭信息,然后確定rawData中的上課信息為空或非本院教師的信息項,最后刪除這些信息項。函數(shù)代碼如下:
在上述函數(shù)基礎上,最后討論第3-6行算法的實現(xiàn)。該部分功能被封裝在generateDptSKinfo函數(shù)中。其僅含一個參數(shù)rawData,即前述清洗后的rawData。運算結果被存人resDptSKinfo數(shù)據(jù)結構中。代碼如下:
該函數(shù)最外層for循環(huán)對列表rawData中的元素逐個進行處理;內層for循環(huán)針對某個特定教師,對其輸人格式的“上課時間”(參見圖l(a))信息進行文本分析,確定放人數(shù)據(jù)結構resDptSKinfo中的索引,并構造出與該索引對應的內容,最后將內容存人索引對應位置。雙重循環(huán)結束后,resDptSKinfo存放完整的教師總覽性上課時間信息。
4 運行結果分析
本文以鄭州航院教務處官方公布的全校教師詳細課程信息作為測試數(shù)據(jù),以驗證算法的可行性和有效性。文件“2017-2018-01TSK-B4.xlsx”包含真實的測試數(shù)據(jù)。使用如下代碼進行集成測試,以得到所需的總覽性上課時間信息:
圖3是以測試數(shù)據(jù)為輸入,經(jīng)上述集成測試代碼運算而得到的結果。為節(jié)省空間,本文只給出部分結果。
從圖3可以看出,運行結果符合輸出格式要求,各時間段教師教學任務占用情況一目了然。例如,周一上午,本院教師教學任務相對較少,每天的第九、十節(jié)基本無教學任務。需要注意的是,若某姓名后面跟有“10X-Y”,則意味著該姓名在整個學校內部存在重名情況,因此增加編碼10加以區(qū)分,此時“X”為起始周,“Y”為終止周,含義同前述。例如,“李琳101-12”表示教師姓名為鄭航智能工程學院的李琳,上課周次為第1周-第12周。該結果被轉給本院教務秘書,以幫助其進行一些教務管理工作安排。經(jīng)過近一個月真實場景的人工驗證,未發(fā)現(xiàn)該運行結果具有任何錯誤、遺漏,教務秘書反映使用效果良好,由此驗證了本文提出算法的可行性與有效性。
5 結語
通過教師總覽性上課時間信息在教務秘書教學管理工作安排中的應用場景分析,本文提出一種總覽性上課時間信息生成算法GenOvClsSchedule,并給出其具體開發(fā)與運行環(huán)境,分析其基于Python語言的具體實現(xiàn)。最后,在一個真實數(shù)據(jù)集上基于真實應用場景驗證了算法的可行性和有效性。
未來算法實現(xiàn)還需作進一步改進,以支持舊版本xls格式的Excel輸入文件和新版本docx格式的Word輸出文件。此外,下一步將與教務管理系統(tǒng)開發(fā)人員合作,以便將本文提出的功能融合到學校的教務管理系統(tǒng)中。