仵子俊 安徽省阜陽市紅旗中學
為了貫徹落實健康第一的指導思想,完成《國家學生體質(zhì)健康標準》測試,促進學生積極參加體育鍛煉,養(yǎng)成良好的鍛煉習慣,筆者所在學校對全體高中學生進行了體質(zhì)數(shù)據(jù)測試,測試項目包括身高、體重、肺活量、立定跳遠、坐位體前屈、800米跑(1000米跑)、一分鐘仰臥起坐、引體向上、左右眼視力等。在測試過程中,由于人員的安排問題,產(chǎn)生了兩張數(shù)據(jù)表格,現(xiàn)在需要用一張表格中的數(shù)據(jù)替換掉另一張表格中的數(shù)據(jù)。在本項目中,筆者利用大單元教學,把學科知識貫徹在項目分解后的具體教學任務(wù)中,使學生在完成任務(wù)的同時學習到知識,同時提高了他們分析問題、解決問題的綜合能力。
本項目中的兩張數(shù)據(jù)表,一張是全部學生的測試數(shù)據(jù)all.xls(大概有近4000條記錄),另一張是部分學生的測試數(shù)據(jù)bufen.xls(大概有300多條記錄)?,F(xiàn)在要用部分學生的數(shù)據(jù)覆蓋掉全部學生表里面的部分學生的數(shù)據(jù)。如果直接復制過去,就會產(chǎn)生400多條姓名和學籍號相同的記錄,這是不被允許的,而如果手工操作從bufen.xls復制過去,覆蓋掉相同姓名和學籍號的學生的測試數(shù)據(jù),又太浪費時間,大概要幾個小時,還容易出錯。那么如何快速、準確地處理這些數(shù)據(jù)呢?其實本項目就是一個解決辦公自動化的問題,為了讓學生掌握利用Python處理Excel表格的技能,學習設(shè)計采用層層遞進的方法,首先學習如何讀取Excel表格信息,然后學習如何把數(shù)據(jù)寫入Excel表格,最后學習如何利用好雙層循環(huán)替換處理Excel表格數(shù)據(jù)。讓學生一步步跟隨項目完成的腳步,學會利用Python處理Excel表格的技能并增強學習能力,提升信息素養(yǎng)。
①學會使用xlrd庫讀取Excel數(shù)據(jù)。②學會使用xlwt庫把數(shù)據(jù)寫入Excel文件。③修改庫xlutils的使用方法。④for循環(huán)的理解及應用。⑤會使用Range()函數(shù)。⑥理解并會使用循環(huán)的嵌套。
師:同學們,近幾天大家都在在操場上進行體質(zhì)數(shù)據(jù)測試,是不是有些同學測試了兩次呢?這是由于第一次測試全部數(shù)據(jù)部分不準確,第二次測試的部分數(shù)據(jù)比較準確,現(xiàn)在我們需要用第二次的數(shù)據(jù)替換掉第一次測試的數(shù)據(jù),怎么操作呢?
教師展示“體測全部數(shù)據(jù).xls”和“部分數(shù)據(jù).xls”兩張Excel表格(如圖1)。
圖1 待處理工作表的結(jié)構(gòu)
師:這兩張表格數(shù)據(jù)就是真實的要處理的數(shù)據(jù)?!肮び破涫?,必先利其器”,為了完成這個任務(wù),需要先完成下面幾個小任務(wù),讓我們來解決問題吧!
圖2
師:請同學觀看導學內(nèi)容,掌握Python xlrd讀取Excel數(shù)據(jù)的具體操作。
導學內(nèi)容:xlrd庫的安裝——pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd。從清華這邊的鏡像去安裝xlrd庫(直接安裝太慢了);讀取工作簿、工作表、單元格信息。
師:通過上面的學習,我們會讀取Excel文件中的數(shù)據(jù)了,但是如何寫入數(shù)據(jù)呢?下面請同學觀看導學內(nèi)容:xlwt庫的安裝(參考xlrd的安裝);xlrd庫只能讀取Excel文件中的數(shù)據(jù)。如果要向Excel文件中寫入數(shù)據(jù),需要使用xlwt庫,同時具備創(chuàng)建工作簿、工作表,以及將數(shù)據(jù)寫入單元格的功能。
圖4
師:xlrd是讀取Excel數(shù)據(jù),xlwt是把數(shù)據(jù)寫入Excel,如何修改Excel數(shù)據(jù)呢?我們可以使用xlutils庫,注意這里的“修改”和實際意義的修改有什么不同?下面請同學們學習導學內(nèi)容:xlutils庫的安裝參考xlrd庫的安裝(先安裝xlrd和xlwt,再安裝xlutils,不然會出錯);修改庫xlutils,對當前已經(jīng)存在的工作簿進行復制,對復制的工作簿進行操作,不是直接修改原工作簿,最后在保存時,如果保存文件相同,就相當于把原來的工作簿替換了而已。
xlrd庫只能用于讀取已經(jīng)存在的Excel文件相關(guān)信息,xlwt庫只能新建工作簿、工作表,寫入內(nèi)容,沒有辦法對現(xiàn)有的工作表進行修改,要實現(xiàn)修改功能,需要安裝xlutils庫,相當于在xlrd和xlwt之間建立起一座橋梁。xlutils庫可以對現(xiàn)有工作簿進行復制,工作簿進行讀取、新建,以及將數(shù)據(jù)寫入單元格,最后保存導學內(nèi)容。
師:如果和列表中的每一個同學打招呼,展示5個同學的姓名,打印出“你好啊,***,很高興見到你”,同學們會想到哪5個print()語句?(教師提示:如果要和我們班每個同學說出姓名,打下招呼呢?)
導學內(nèi)容如下:
在Python中,for語句的格式:
for <變量> in <序列>:
<循環(huán)體>
for語句通過遍歷序列中的元素實現(xiàn)循環(huán),并通過序列的元素數(shù)量來控制循環(huán)次數(shù),即循環(huán)過程,序列中的每個元素都會依次被賦值給變量,并分別執(zhí)行一次循環(huán)體。
for語句的例子。現(xiàn)在有一個列表hobby = ["籃球", "羽毛球", "看書", "旅行", "音樂"],將hobby中的所有元素輸出到屏幕上(一行一個元素),可通過下面的語句來實現(xiàn):
hobby=["籃球","羽毛球","看書","旅行","音樂"]
for x in hobby:
print(x)
該語句執(zhí)行后,輸出的結(jié)果是:
籃球
羽毛球
看書
旅行
音樂
range函數(shù)的用法。內(nèi)建函數(shù)range(起始值,終值,步長值)由三個參數(shù)來決定序列中元素的個數(shù)和范圍。range(0,10,1)生成0~9這10個整數(shù)序列,若起始值缺省,則默認值為0;步長值是序列中的每個元素之間的差,若缺省,則默認值為1;一個參數(shù)range(n)產(chǎn)生的范圍[0,n),二個參數(shù)range(n,m)(n<m)產(chǎn)生的范圍[n,m),三個參數(shù)range(n,m,step)產(chǎn)生從n開始(包括n),步長是step,到m結(jié)束。
range函數(shù)的例子。編程實現(xiàn)輸出1~10偶數(shù)序列。可通過下面的語句來實現(xiàn):
for num in range(2,11,2):
print(num,end=' ')
該語句執(zhí)行后,輸出的結(jié)果是:
2 4 6 7 10
倒序輸出1~10之間的奇數(shù):
for num in range(9,0,-2):
print(num,end=' ')
該語句執(zhí)行后,輸出的結(jié)果是:
9 7 5 3 1
師:單獨使用for循環(huán),往往無法解決復雜的問題。如需要解決類似“工作要做很多遍,而每一遍都是需要重復做一些事情”的問題,就要用到多重循環(huán),即“循環(huán)嵌套”。如果某一種循環(huán)語句中包含著自身或其他循環(huán)語句,就稱為循環(huán)的“嵌套”。for循環(huán)之間可以相互嵌套。
導學內(nèi)容包含用for循環(huán)嵌套語句,輸出以下數(shù)字排列圖形(如圖5)及代碼(如圖6)。
i負責輸入的行數(shù),j負責每行輸出的內(nèi)容。
打印99乘法表(如圖7)。
圖7
外層循環(huán)i從1到9控制打印的行數(shù),內(nèi)層循環(huán)控制打印的列數(shù),代碼如下頁圖8所示。
圖8
師:當完成了上面的5個任務(wù)后,完成本項目就不是什么難事了,我們要用“部分數(shù)據(jù).xls”中的數(shù)據(jù)內(nèi)容替換掉“體測全部數(shù)據(jù).xls”中的內(nèi)容。因為每個同學的“學籍號”都不一樣,具有唯一性,所以“學籍號”所在的E列就是第五列,通過判斷學籍號是否相等來進行查處。
外層循環(huán)就是“部分數(shù)據(jù).xls”第二行(第一行為列名)到最后一行的數(shù)據(jù),內(nèi)層循環(huán)就是“體測全部數(shù)據(jù).xls”第二行到最后一行的數(shù)據(jù),依此從“部分數(shù)據(jù).xls”取一行,遍歷“體測全部數(shù)據(jù).xls”的所有行,如果兩張表格的cell(i,4).value相等,說明找到了。然后用“部分數(shù)據(jù).xls”覆蓋“體測全部數(shù)據(jù).xls”對應的行就可以了。代碼如圖9所示。
圖9