Python處理數據是很方便的,用來分析學生成績,生成成績報告還是方便的。其實只要認真找一本Python科學計算的書籍,認真學一遍就知道怎么辦了,但是系統學習成本太高,所以盡管網上免費的資源汗牛充棟,我還是要重復造輪子,也記錄自己學習的過程。
對于數據科學家或者專業的程序員來說,處理excel這種事其實非常小兒科,但是成績分析不在他們的業務范圍內,所以面向教務員、信息技術老師的python成績分析的教程相對比較少;學校里相當一部分辦公室人員、行政人員、教務員都是信息技術教師擔任的,很多數理老師學習編程能力也很強或者本身有編程基礎,而數理老師擔任班主任的挺多,也有成績分析的需求,從這部分老師的使用場景出發,來分析python處理成績應該怎么做,甚至擴展到辦公自動化的需求。
成績分析
實際上現在成績分析已經容易多了,裝備了智學網、全通等各種網絡閱卷系統的學校,如果是網上閱卷,很容易就能夠根據自己的需求得到需要的成績分析報告,平均分最高分,三線一律,分數段分析等等,除了數據還能夠給出豐富的圖表;也有的考試系統,雖然給出了洋洋灑灑數頁的分析報告,但是不能定制,不能提供學科老師關注的成績分析的點;至于這些成績分析,能否給出更加詳細的知識點掌握情況的反饋,這個不在本文討論之列,本文只討論每科最終得分;有的學校是由教務員或者信息技術老師用Excel或者成績分析軟件進行分析,但是多年的成績數據往往不能夠形成數據庫,相對來說比較分散。
能夠購買網上閱卷系統或者成績分析軟件的學校其實還是少數,大部分都是自己用Excel進行分析,如果是單個班級單個學科,用Excel進行成績分析并不復雜,但是如果涉及到任教的所有班級、整個年級甚至整個學校,用Excel進行成績分析的工作就會相當繁重,大大超過了學會python再來進行成績分析的工作量。所以無論是因為缺乏必要的軟件工具,還是用Excel太復雜又或者不能勝任,學習用python來進行成績分析和處理都是有必要的,無論是對于當前在校的老師還是還在學校的師范生。疫情當前,生活本來就很難,提高工作效率,會有更多的時間放空和養生,畢竟無論什么時候養生都是第一位呢。
當然用python來處理一個年級的成績,需要所有的成績表格式一致,不一致的話需要進行預處理也就是所謂的數據清洗,這樣寫程序會避免寫一些額外的代碼,畢竟大家都知道代碼其實并不智能,你要寫的很智能,就要增加非常度的開發量,但是這些開發量可以通過統一格式來避免;有的學校統計成績用釘釘的在線表格或者金山在線文檔,格式會一致,這樣就會方便很多;很多高大上的功能,在實際中并不是很重要,甚至我們不處理異常,更多的我們寫的是一次性的腳本或者程序,運行一次之后就“丟棄了”,當然了成績分析這種事,年年有,每個學期有,花費心思定制屬于自己的成績分析軟件是值得的,畢竟大部分老的教師職業生涯都要三四十年,從這個角度學習python,在現有軟件不能滿足需求,學校自己不足的情況下,開發自己的成績分析軟件,用的順手的軟件是很賺的。
事情做多了,手熟了,就會有自己的一套方法,把這套方法用程序表示出來,并漸漸的能夠兼容很多亂七八糟的情況,屬于自己的軟件就成了。從這個角度,我很佩服以前工作的學校的一個體育老師,自己從零開始學習,開發了青島市運動會管理系統,從這個角度,他比我厲害。
Python庫的選擇
其實用Python進行成績分析,Pandas無疑是最強大的,然后才是其他的Excel相關的第三方庫,比如xlrd&xlwt、openpyxl、xlxwriter等,但是情境的不同需要選擇的庫也不同。
xlrd&xlwt
xlrd的作用是讀取Excel文件,xlwt是修改Excel文件。不管悲催的是,想要既要讀取又修改&吸入Excel,還需要第三方庫的支持。相對來說修改并保存Excel的邏輯比較復雜,所以只有僅需讀取excel的時候,用xlrd。
openpyxl
這個庫不支持2003版本的excel,excel 2010之后的都是支持的,現在一般電腦自帶的excel版本都比較新,所以用這個庫不會遇到太多的兼容性問題;即便是偏遠地區,薄弱校,excel的版本大多是2007或者wps,實在不行,如果真的是excel2003,裝個wps也能解決問題。
openpyxl的API設計的比xlrd合理,跟我們日常使用excel的邏輯是一致的,讀取并寫入excel也很優雅流程,跟我們用excel打開文件,然后保存一樣簡單。甚至openpyxl還支持公式等操作,但是其實,我們只需要用到數據的讀取就好了。
如果是用xlrd&xlwt類似的庫來讀取寫入excel,進行成績分析,成績分析的算法需要自行實現,好比你買了一套工具比較少的工具箱,能夠滿足基本需求,但是高級的需求要自己實現,畢竟只有一把銼刀也可以造錘子,但是如果有機床肯定更加方便。但是如果是用pandas庫進行成績分析,那么就好比從傳統木工工具上升到了機床,直接數控開榫,效率大大提高。pandas求總分、平均分,六選三不同組合的分是很簡單的,幾乎跟用excel公式沒有差別,但是相對來說openpyxl稍微麻煩點,pandas處理數據是按照矢量來的,跟openpyxl是不同的。不過對于初學者pandas更加容易理解,就像小孩子在學習小烏龜編程,寧愿復制命令,也不會主動的用循環或者函數簡化代碼,要么不會,要么掌握的不夠熟練。
openpyxl的安裝
安裝非常簡單,只需要在python中的命令行提示符中
python -m pip install openpyxl
或者更簡單一點
pip install openpyxl
pandas
pandas無疑是強大的,坦白的講,我自己也不熟悉,當然這也是我寫文章的原因,記錄自己學習的過程,健身學習印象。
處理excel
文件的打開和關閉
其實,分析成績最常見的工作流就是:打開文件,編輯excl文件,保存文件。這個流程用excel來做舊比較簡單。
from openpyxl import load_workbook
# 打開excel文件
wb = load_workbook('iamhappy.xlsx')
# 選擇第1個工作表sheet
ws = wb.active
# 修改A1單元格的值
ws['A1'] = '茍日新,日日新'
# 保存文件
wb.save('iamhappy.xlsx')
首先從openpyxl
庫中導入加載(打開)excel文件要用到的方法(工具)load_workbook
,然后調用,相當于在excel通過打開菜單,打開文件;而wb.active其實就是選擇默認激活的工作表,在excel中默認激活的excel一般是第一個,當然你修改了就不是了,這個在處理excel的時候是需要注意的。
這個是用wps創建的默認只有一個sheet,而excel老版本創建的工作簿默認有3個sheet(工作表),現在最新的excel 365也是一個了。而運行
ws = wb.active
就相當于,用鼠標單擊了Sheet1
,意味著要在這個工作表中處理數據。
注意我們平時說的excel文件術語是工作簿,也就是英文的worksheet,習慣性縮寫為wb;而工作表就是sheet,也就是worksheet這個詞,習慣性縮寫為ws;日常生活中一般很少用工作簿或者工作表,除非是寫書,一般說excel文件和sheet。**還需要注意的是,在excel打開的情況下,python程序無法操縱excel文件的,需要在文件關閉的狀態下進行。
文件的修改
打開關閉文件只是準備工作,對數據修改才是核心,也就是數據的插入、修改、刪除、復制、計算、格式等操作,我們慢慢講來。
在這里需要贅述下excel中的基本概念,單元格,單元格的值,單元格的行標和列標,以及單元格的格式,單元格值的修改;然后是行的概念,列的概念,表頭;然后是公式;這是一些基礎的概念,想要用python處理excel,就要知道在python的第三方庫xlrd、openpyxl以及pandas,這些操作是如何完成的,掌握了這些知識,就可以愉快的用python進行數據處理了。所以從這個角度來看,python處理數據其實很簡單的。
以前陪朋友去咨詢古箏課程,說學習古箏有兩種學習方法,一種是為了考級那就非常系統的學習,一種是老頭老太太,學會彈奏一兩首就行了,這兩種學習目的不同的人,教學方式也不同,就像有人看了陳情令,買了笛子就只想學會不羈是一樣的。
單元格值的讀取和修改
可以說無論是什么水平的excel使用者,大部分時間都花在了跟單元格打交道上,夸張點說,只要我們知道了如何讀取單元格,如何設置、修改單元格的值,我們就已經可以使用excel了,同樣可以用python處理excel了,因為無非是python讀取數據,編寫處理數據處理的程序,然后把處理的結果輸出到excel,所以學會處理excel的值是最重要的。
而openpyxl的API顯然是經過了非常良好的設計,可以方便的讀取工作簿(英文單詞是哪個?)中工作表中的單元格的值。
日常使用excel的時候,描述一個單元格,往往會說B4
單元格,在excel中,行的序號是字母以及字母的組合,列的序號是阿拉伯數字。而openpyxl庫的作者利用python提供的一些魔術方法,使得我們在用這個庫訪問excel單元格的數據的時候,跟我們日常習慣相同。所以從語法上看ws["A1"]
是在訪問字典ws中鍵為A1的元素,實際上,得益于魔術方法,訪問的是ws中第1列第1行的數據,ws在openpyxl中,可以看做是一個具有二維數組特性的類,當然擴展了很多屬性,這種實現是很妙的,得益于python良好的語言架構,如果你讀過《流暢的Python》這本書就更能領會優雅精妙之處了,由于python提供的魔術方法,我們可以像操作python自帶的數據結構一樣操作自定義的類,比如這個中括號運算,真的是非常的方便了。
既然知道了怎么修改了,其實讀取值也是一樣的,還是ws["A1"].value
或者ws["B4"].value
,如果想要輸出單元格的值,只要
from openpyxl import load_workbook
# 打開excel文件
wb = load_workbook('iamhappy.xlsx')
# 選擇第1個工作表sheet
ws = wb.active
# # 修改A1單元格的值
# ws['A1'] = '茍日新,日日新'
# 讀取單元格的值
print(ws["A1"].value)
# 保存文件
wb.save('iamhappy.xlsx')
小結
所以到這里,我們已經理解了如何打開、保存excel,讀取和修改單元格的值,這就可以用excel處理需求了,可以這是用python處理excel數據需要學習的最簡單的技巧了。寫這些一方面是想學習,一方面也是打發時間,還有一些說不清道不明的原因,反正就是寫點總比不寫好。雖然我打算寫的是針對學校場景中的信息技術老師、教務員以及想用python分析成績的學科老師的內容,但是其他應用場景下的無產階級兄弟們也是可以學習借鑒,只不過力求通俗(懶)所以寫的很是臃腫啰嗦,近乎于培訓講座的逐字稿。
練習
你可以試著安裝下openpyxl庫,然后用openpyxl打開(這里不用讀取用打開其實是為了與日常使用excel的體驗一致)一個已有的excel文件,
- 讀取單元格的數據,用
print
函數打印出來,顯示在命令行中; - 修改excel中某個單元格的值
- 打開一個成績表,求幾個學生的總分,當然所有學生的總分需要用到循環