Python專案開發案例(一)————學生資訊管理系統

Kocurry 發表於 2020-09-11
Python

一、學生資訊管理系統

        本章使用Python語言開發了一個學生資訊管理系統,該系統可以幫助教師快速錄入學生的資訊,並且對學生的資訊進行基本的增、刪、改、查操作;還可以根據排序功能,巨集觀地看到學生成績從高到低的排列,隨時掌握學生近期的學習狀態,實時地將學生的資訊儲存到磁碟檔案中。

1.1  需求分析

        為了順應網際網路時代使用者的獲取資料需求,學生資訊管理系統應該具備以下功能:

  • 新增學生及成績資訊;
  • 將學生資訊儲存到檔案中;
  • 修改和刪除學生資訊;
  • 查詢學生資訊;
  • 根據學生成績進行排序;
  • 統計學生的總分。

1.2  系統設計

1.2.1  系統功能結構

        學生資訊管理系統分為7大功能模組,主要包括錄入學生資訊模組、查詢學生資訊模組、刪除學生資訊模組、修改學生資訊模組、學生成績排名模組、統計學生總人數模組及顯示全部學生資訊模組。學生資訊管理系統的功能結構如圖1.1所示。

Python專案開發案例(一)————學生資訊管理系統

                                                                            圖1.1  系統功能結構圖

1.2.2  系統業務流程

        在開發學生資訊管理系統前,需要先了解系統的業務流程。根據學生資訊管理系統的需求分析及功能結構,設計如圖1.2所示的系統業務流程。

Python專案開發案例(一)————學生資訊管理系統

1.3  系統開發必備

1.3.1  系統開發環境

本系統的軟體開發及執行環境具體如下:

  • 作業系統:Windows7、Windows10;
  • Python版本:Python 3.7;
  • 開發工具:Python IDLE;
  • Python內建模組:os、re。

1.3.1  資料夾組織結構

        學生資訊管理系統的資料夾結構比較簡單,只包括一個Python檔案。在執行程式時,會在專案的根目錄下自動建立一個名稱為students.txt檔案,用於儲存學生資訊。

1.4  主函式設計

1.4.1  功能概述

        學生資訊管理系統的主函式main(),主要用於實現系統的主介面。在主函式main()中,呼叫menu()函式生成功能選擇選單,並且應用if語句控制各個子函式的呼叫,從而實現對學生資訊的錄入、查詢、顯示、修改、排序和統計等功能。

1.4.2  主函式的業務流程

        在設計學生資訊管理系統的主函式時,先要梳理出它的業務流程和實現技術。根據學生資訊管理系統主函式要實現的功能,設計出如圖所示的業務流程。

Python專案開發案例(一)————學生資訊管理系統

1.4.3  實現主函式

        執行學生資訊管理系統,首先將進入主功能選單的選擇介面,在這裡列出了程式中的所有功能,使用者可以根據需要輸入要執行功能對應的數字編號或者按下鍵盤上的方向鍵,進入對應的子功能中去。其次在menu()函式中主要使用print()函式自愛控制檯輸出文字和特殊字元組成的功能選單。當使用者輸入功能編號或者選擇相應的功能後,程式會根據使用者選擇的功能編號(如果是通過方向鍵選擇的功能,程式會自動提取出對應的數字)呼叫不同的函式,具體數字表示的功能如表1.1所示。

 

編號功能
0退出系統
1錄入學生資訊,呼叫insert()函式
2查詢學生資訊,呼叫search()函式
3刪除學生資訊,呼叫delete()函式
4修改學生資訊,呼叫modify()函式
5對學生成績排序,呼叫sort()函式
6統計學生總人數,呼叫total()函式
7顯示所有學生的資訊,呼叫show()函式

                                                                        表1.1  選單中的數字所表示的功能

主函式main()的實現程式碼如下:

def main():
    ctrl = True                                         #標記是否退出系統
    while (ctrl):
         menu()                                         #顯示選單
         option = input(“請選擇:”)                       #選擇選單項
         option_str = re.sub("\D","",option)            #提取數字
         if option_str in ['0','1','2','3','4','5','6','7']:
             option_int = int(option_str)
             if option_int == 0:                        #退出系統
                  print('您已退出學生資訊管理系統!')
                  ctrl = False
             elif option_int ==1:                       #錄入學生成績資訊
                  insert()
             elif option_int ==2:                       #查詢學生成績資訊
                  search()
             elif option_int ==3:                       #刪除學生成績資訊
                  delete()
             elif option_int ==4:                       #修改學生成績資訊
                  modify()
             elif option_int ==5:                       #排序
                  sort()
             elif option_int ==6:                       #統計學生總數
                  total()
             elif option_int ==7:                       #顯示所有學生資訊
                  show()

1.4.4  顯示主選單

        在主函式main()中,呼叫menu()函式,用於顯示功能選單。他的具體程式碼如下:

def menu():
#輸出選單
print("'

------------------學生資訊管理系統-----------------
|                                                |
|====================功能選單====================|
|                                                |
|                                                |
|     1 錄入學生資訊                              |
|     2 查詢學生資訊                              |
|     3 刪除學生資訊                              |
|     4 修改學生資訊                              |
|     5 排序                                     |
|     6 統計學生總人數                            |
|     7 顯示所有學生資訊                          |
|     0 退出系統                                  |
|                                                |
|                                                |
|                                                |
|                                                |
|                                                |
|=============================================== |
|                                                |
|------------------------------------------------|

"')

 

1.5  學生資訊維護模組設計

1.5.1  學生資訊維護模組概述

        在學生資訊管理系統中學生資訊維護模組用於維護學生資訊。主要包括錄入學生資訊、修改學生資訊和刪除學生資訊,這些學生資訊會儲存到磁碟檔案。其中,當使用者在功能選擇介面中輸入數字“1”(或者使用方向鍵選擇“1錄入學生資訊”選單項),即可進入錄入學生資訊功能。在這裡可以實現批量錄入學生資訊,並儲存到磁碟檔案中,執行效果如圖所示。

        當使用者在功能選擇介面中輸入數字“3”(或者使用方向鍵選擇“3刪除學生資訊”選單項),將進入刪除學生資訊功能介面。在這裡可以實現根據學生ID從磁碟檔案中刪除指定的學生資訊,執行效果如圖所示。

        當使用者在功能選擇介面中輸入數字“4”(或者使用方向鍵選擇“4修改學生資訊”選單項),將進入修改學生資訊功能介面。在這裡可以實現根據學生ID修改指定的學生資訊,執行效果如圖所示。

1.5.2  實現錄入學生資訊功能

1.功能概述

        錄入學生資訊功能主要就是獲取使用者在控制檯上輸入的學生資訊,並且把它們儲存到磁碟檔案中,從而達到永久儲存的目的。例如,在功能選單上輸入功能編號1,並且按下<Enter>鍵,系統將分別提示輸入學生編號、學生名字、英語成績、Python成績和C語言成績的資訊,輸入正確的資訊後,系統會提示是否繼續新增,如圖所示。輸入“y”,系統將再次提示使用者輸入學生資訊,輸入“n”,系統將錄入的學生資訊儲存到檔案中。

2.業務流程

        在實現錄入學生資訊功能時,先要梳理出它的業務流程和實現技術。錄入學生資訊的業務流程和實現技術如圖所示。

Python專案開發案例(一)————學生資訊管理系統

3.具體實現

(1)編寫一個向檔案中寫入指定內容的函式,將其命名為save(),該函式有一個列表型別的引數,用於指定要寫入的內容。save()函式的具體程式碼如下:

#將學生資訊儲存到檔案
def save(student)
    try:
        student_txt = open(filename,"a")       #以追加模式開啟
    except Exception as e:
        student_txt = open(filename,"w")       #檔案不存在,建立檔案並開啟
    for info in student:
        student_txt.write(str(info)+"\n")      #按行儲存,新增換行符
    student_txt.close()                        #關閉檔案  
  • 在上面的程式碼中,將以追加的模式開啟一個檔案,並且應用try...except語句捕獲異常。如果出現異常,則說明沒有要開啟的檔案,這時再以寫的模式建立並開啟檔案,接下來通過for語句將列表中的元素一行一行寫入檔案中,每行結束新增換行符。

(2)編寫主函式的呼叫的錄入學生資訊的函式insert()。在該函式中,先定義一個儲存學生資訊的空列表,然後設定一個while迴圈,在該迴圈中通過input()函式要求使用者輸入學生資訊(包括學生ID、名字、英語成績、Python成績和C語言成績)。如果這些內容都符合要求,則將它們儲存到字典中,再將該字典新增到列表中並且詢問是否繼續錄入;如果不再錄入則結束while迴圈,並呼叫save()函式,將錄入的學生資訊儲存到檔案中。insert()函式的具體程式碼如下:

def insert():
    stdentList = []                                         #儲存學生資訊的列表
    mark = True                                             #是否繼續新增
    while mark:
          id = input(“請輸入ID(如1001):”)
          if not id:                                        #ID為空,跳出迴圈
               break
          name = input("請輸入名字:")
          if not name:                                      #名字為空,跳出迴圈
               break
          try:
               english = int(inpu("請輸入英語成績:"))
               python = int(inpu("請輸入Python成績:"))
               c = int (inpu("請輸入C語言成績:"))
          except:
              print("輸入無效,不是整型數值....重新錄入資訊")
              continue
          #將輸入的學生資訊儲存到字典
          stdent  = {"id":id,"name":name,"english":english,"python":python,"c":c}
          stdentList.append(stdent)                        #將學生字典新增到列表中
          inputMark = input("是否繼續新增?(y/n):") 
          if inputMark == "y":                             #繼續新增
              mark  = True
          else:                                            #不繼續新增
              mark = False  
    save(stdentList)                                       #將學生資訊儲存到檔案
    print("學生資訊錄入完畢!!!")
  • 上面的程式碼中,設定一個標記變數mark,用於控制是否退出迴圈。

(3)執行錄入學生資訊後,將在專案的根目錄中建立一個名稱為students.txt的檔案,該檔案中儲存著學生資訊。例如,輸入2條資訊後,students.txt檔案的內容如圖所示。

1.5.3  實現刪除學生資訊功能

1.功能概述

        刪除學生資訊功能主要就是使用者在控制檯上輸入的學生ID,到磁碟檔案中找到對應的學生資訊,並將其刪除。例如,在功能選單上輸入功能編號“3”,並且按下<Enter>鍵,系統將提示輸入要刪除學生的編號,輸入相應的學生ID後,系統會直接從檔案中刪除該學生資訊,並且提示是否繼續刪除,如圖所示。輸入“y”,系統將會再次提示使用者輸入要刪除的學生編號,輸入“n”,則退出刪除功能。

2.業務流程

        在實現刪除學生資訊功能時,先要梳理出它的業務流程和實現技術。根據要實現的功能,設計出如圖所示的業務流程和實現技術。

Python專案開發案例(一)————學生資訊管理系統

3.具體實現

        編寫主函式中呼叫的刪除學生資訊的函式delete()。在該函式中,設定一個while迴圈,在該迴圈中,首先通過input()函式要求使用者輸入要刪除學生ID;然後以只讀模式開啟儲存學生資訊的檔案,並且讀取其內容儲存到一個列表中;再以寫模式開啟儲存學生資訊的檔案,並且遍歷儲存學生資訊的列表,將每個元素轉換為字典,從而方便根據輸入的學生ID判斷是否為要刪除的資訊。如果不是要刪除的資訊,則將其重新寫入到檔案中。delete()函式的具體程式碼如下:

def delete():
    mark = True                                         #標記是否迴圈
    while mark:
        studentId = input("請輸入要刪除的學生ID:")
        if studentId is not "":                         #判斷是否輸入要刪除的學生
             if os.path.exists(filename):               #判斷檔案是否存在
                 with open(filename,'r') as rfile:      #開啟檔案
                     student_old = rfile.readlines()    #讀取全部內容
             else:
                 student_old = []
             ifdel = False                              #標記是否刪除
             if student_old:                            #如果存在學生資訊
                 with open(filename,'w')as wfile:       #以寫方式開啟檔案
                    d = {}                 
                    for list in student_old: 
                        d= dict(eval(list))             #字串轉字典
                        if d['id'] != studentId:
                            wfile.write(str(d) + "\n")  #將一條學生資訊寫入檔案
                        else:
                            ifdel = True                #標記已經刪除
                    if ifdel:
                        print("ID為%s的學生資訊已經被刪除..." % studentId)
                    else:
                        print("沒有找到ID為 %s 的學生資訊..." % studentId)
             else:                                     #不存在學生資訊
                 print("無學生資訊...")
                 break                                 #退出迴圈
             show()                                    #顯示全部學生資訊
             inputMark = input("是否繼續刪除?(y/n):")
             if inputMark == "y":
                  mark = True                          #繼續刪除
             else:
                 mark = False                          #退出刪除學生資訊功能
  •         上面程式碼中,呼叫了show()函式顯示學生資訊,該函式將在1.6.4小節中進行介紹。

1.5.4  實現修改學生資訊功能

1.功能概述

        修改學生資訊功能主要就是根據使用者在控制檯上輸入的學生ID,從磁碟檔案中找到對應的學生資訊,再對其進行修改。例如,在功能選單上輸入功能編號“4”,並且按下<Enter>鍵,系統首先顯示全部學生資訊列表,再提示輸入要修改學生的編號。輸入相應的學生ID後,系統會在檔案中查詢該學資訊,如果找到,則提示修改相應的資訊,否則不修改。最後提示是否繼續修改,如圖所示。輸入“y”,系統將會再次提示使用者輸入要修改的學生編號,輸入“n”,則退出修改功能。

2.業務流程

        在實現修改學生資訊功能時,先要梳理出它的業務流程和實現技術。如圖所示。

Python專案開發案例(一)————學生資訊管理系統

3.具體實現

        編寫主函式中呼叫的修改學生資訊的函式modify()。在該函式中,呼叫show()函式顯示全部學生資訊,之後再判斷儲存學生資訊的檔案是否存在。如果存在,以只讀模式開啟檔案,並且讀取全部學生資訊儲存到列表中,否則返回。接下來提示使用者輸入要修改的學生ID,並且以只寫模式開啟檔案。開啟檔案後,遍歷儲存學生資訊的列表,將每個元素轉換為字典,再根據輸入的學生ID判斷是否為要修改的資訊。如果是要修改的資訊,則提示使用者輸入新的資訊,並儲存到檔案,否則直接將其寫入檔案中。modify()函式的具體程式碼如下:

def modify():
    show()                                   #顯示全部學生資訊
    if os.path.exists(filename):             #判斷檔案是否存在
        with open(filename,'r') as rfile:    #開啟檔案
            student_old = rfile.readlines()
    else:
        return
    studentid = input("請輸入要修改的學生ID:")
    with open(filename,"w") as wfile:        #以只寫模式開啟檔案
        for student in student_old:
            d = dict(eval(student))          #字串轉字典
            if d["id"] == studentid:         #是否為要修改的學生
               print("找到了這名學生,可以修改他的資訊!")
               while True:                  #輸入要修改的資訊
                    try:
                        d["name"] = input("請輸入姓名:")
                        d["english"] = int(input("請輸入英語成績:"))
                        d["python"] = int(input("請輸入Python語言:"))
                        d["c"] = int(input("請輸入C語言:"))
                    except:
                        print("您的輸入有誤,請重新輸入。")
                    else:
                        break                #跳出迴圈
               student = str(d)              #將字典轉換為字串
               wfile.write(studnet + "\n")   #將修改的資訊寫入到檔案
               print("修改成功!")
            else:
               wfile.write(student)          #將未修改的資訊寫入到檔案
    mark = input("是否繼續修改其他學生資訊?(y/n):")
    if mark == "y":
        modify()                             #重新執行修改操作

 

1.6  查詢/統計模組設計

1.6.1  查詢/統計模組概述

        在學生資訊管理系統中,查詢/統計模組用於查詢和統計學生資訊。主要包括根據學生編號或姓名查詢學生資訊、統計學生總人數和顯示所有學生資訊。在顯示獲取到的學生資訊時,會自動計算總成績。其中,當使用者在功能選擇介面中輸入數字“2”或者使用方向鍵選擇“2查詢學生資訊”選單項,即可進入到查詢學生資訊功能。在這裡可以實現根據學生編號或姓名查詢學生資訊,執行效果如圖所示。

        當使用者在功能選擇介面中輸入數字“6”(或者使用方向鍵選擇“6統計學生總人數”選單項),即可進入到統計學生總人數功能。在這裡可以實現統計並顯示學生總人數的資訊,執行效果如圖所示。

        當使用者在功能選擇介面中輸入數字“7”(或者使用方向鍵選擇“7顯示所有學生資訊”選單項),即可進入到顯示所有學生資訊功能。在這裡可以實現顯示全部學生資訊(包括學生的總成績),執行效果如圖所示。

1.6.2  實現查詢學生資訊功能

1.  功能概述

        查詢學生資訊功能主要是根據使用者在控制檯上輸入學生ID或者姓名,到磁碟檔案中找到對應的學生資訊。例如,在功能選單上輸入功能編號“2”,並且按下<Enter>鍵,系統將要求使用者選擇是按學生編號查詢還是按學生姓名查詢,如果使用者輸入“1”,則要求使用者輸入學生ID,表示按學生編號查詢。接著輸入想要查詢的學生編號,系統查詢該學生資訊,如果找到則顯示,效果如圖所示。否則顯示“無資料資訊”。最後提示是否繼續查詢輸入“y”,系統將再次提示使用者選擇查詢方式,輸入“n”,則退出查詢學生資訊功能。

2.  業務流程

        在實現查詢學生資訊功能時,先要梳理出它的業務流程和實現技術。根據要實現的功能,設計出如圖所示的業務流程和實現技術。

Python專案開發案例(一)————學生資訊管理系統

3.  具體實現

        編寫主函式中呼叫的查詢學生資訊的函式search(),設定一個迴圈並在該迴圈中先判斷儲存學生資訊的檔案是否存在,如果不存在則給出提示並返回,否則提示使用者選擇查詢方式;然後根據選擇的方式到儲存學生資訊的檔案中查詢對應的學生資訊,並且呼叫show_student()函式將查詢結果進行顯示。search()函式的具體程式碼如下:

def search():
    mark = True
    student_query = []                              #儲存查詢結果的學生列表
    while mark:
         id = ""
         name = ""
         if os.path.exists(filename):               #判斷檔案是否存在
             mode = input("按ID查輸入1;按姓名查輸入2:")
             if mode == "1":
                  id = input("請輸入學生ID:")       #按學生編號查詢
             elif mode == "2":
                  name = input("請輸入學生姓名:")   #按學生姓名查詢
             else:
                  print("您的輸入有誤,請重新輸入!")
                  search()                        #重新查詢
             with open(filename,'r')as file:        #開啟檔案
                  student = file.readlines()        #讀取全部內容
                  for list in student:
                      d = dict(eval(list))          #字串轉字典
                      if id is not "":              #判斷是否按ID查詢
                          if d['id'] == id:
                              student_query.append(d) #將找到的學生資訊儲存到列表中
                      elif name is not "":            #判斷是否按姓名查詢
                          if d['name'] == name:
                              student_query.append(d)
                  show_student(student_query)         #顯示查詢結果
                  student_query.clear()               #清空列表
                  inputMark = input("是否繼續查詢?(y/n):") 
                  if inputMark == "y":
                       mark = True
                  else:
                       mark = False
        else:
            print("暫未儲存資料資訊...")
            return 

        在上面的程式碼中, 呼叫了函式show_student(),用於按指定格式顯示獲取的列表。show_student()函式的具體程式碼如下:

#將儲存的列表中的學生資訊顯示出來
def show_student(studentlist):
    if not studentlist:
         print("無資料資訊\n")
         return
    #定義標題顯示格式
    format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"
    print(format_title.format("ID","名字",
                   "英語成績","Python成績","C語言成績","總成績"))#按指定格式顯示標題
    #定義具體內容顯示格式
    format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
    for info in studentList:    #通過for迴圈將列表中的資料全部顯示出來
        print(format_data.format(info.get("id"),
              info.get("name"),str(info.get("english")),str(info.get("python")),
              str(info.get("c")),
              str(info.get("english")+info.get("python")+
              info.get("c")).center(12)))

        上面的程式碼中,使用了字串的format()方法對其進行格式化。其中再指定字串的顯示格式時,數字表示所佔寬度,符號"^"表示居中顯示,“\t”表示新增一個製表符。

1.6.3 實現統計學生總人數功能

1.  功能概述

        統計學生總人數功能主要是統計學生資訊檔案中儲存的學生資訊個數。例如,在功能選單上選擇“6統計學生人數”,並且按下<Enter>鍵,系統將自動統計處學生總人數並顯示。

2.  業務流程

        在實現統計學生總人數功能時,先要梳理出它的業務流程和實現技術,如圖所示。

Python專案開發案例(一)————學生資訊管理系統

3. 具體實現

        編寫主函式中呼叫的統計學生總人數的函式show()。在該函式中,新增一個if語句,用於判斷儲存到學生資訊的檔案是否存在,如果存在則以只讀模式開啟該檔案,讀取該檔案的全部內容後儲存到一個列表中。然後再遍歷該列表,並將其元素轉換為字典,再新增到一個新列表中,最後再呼叫show_student()函式將新列表中的資訊顯示。show()函式的具體程式碼如下:

def show():
    student_new = []
    if os.path.exists(filename):                 #判斷檔案是否存在
       with open(filename,'r') as rfile:         #開啟檔案
            student_old = rfile.readlines()      #讀取全部內容
       for list in student_old:
            studdent_new.append(eval(list))      #將找到的學生資訊儲存到列表中
       if student_new:
            show_student(student_new)
    else:
       print("暫存儲存資料資訊...")

1.6.4  實現顯示所有學生資訊功能

1.  功能概述

        顯示所有學生資訊功能主要就是將學生資訊檔案中儲存的全部學生資訊獲取並顯示。例如,在功能選單上選擇“7顯示所有學生資訊”選單項,並且按下<Enter>鍵,系統將獲取並顯示全部學生資訊。

2.  業務流程

        在實現顯示所有學生資訊功能時,先要梳理出它的業務流程和實現技術,如圖所示。

Python專案開發案例(一)————學生資訊管理系統

3. 具體實現

        編寫主函式中呼叫的統計學生總人數的函式show()。在該函式中,新增一個if語句,用於判斷儲存學生資訊的檔案是否存在,如果存在則以只讀模式開啟該檔案,讀取該檔案的全部內容後儲存到一個列表中。然後再遍歷該列表,並將其元素轉換為字典,再新增到一個新列表中,最後再呼叫show_student()函式將新列表中的資訊顯示。show()函式的具體程式碼如下:

def show():
    student_new = [] 
    if os.path.exists(filename):             #判斷檔案是否存在
         with open(filename,'r') as rfile:   #開啟檔案 
             student_old = rfile.readlines() #讀取全部內容
         for list in student_old:
             student _new.append(eval(list)) #將找到的學生資訊儲存到列表中
         if student_new:
             show_student(student _new)
   else:
       print("暫未儲存資料資訊...")
  •  上面的程式碼,呼叫show_student()函式將學生資訊顯示到控制檯上。show_student()函式已經在1.6.2小節中建立完成。

1.7 

1.7.1  排序模組概述

在學生資訊管理系統中,排序模組用於對學生資訊按成績進行排序。主要包括按英語成績、Python成績、C語言成績和總成績按升序或降序排列。其中,當使用者在功能選擇介面中輸入數字“5”,或者使用方向鍵選擇“5排序”選單項時,即可進入到排序功能。在這裡先錄入順序顯示學生資訊(不排序),然後要求使用者選擇排序方式,並根據選擇方式進行排序顯示。

1.7.2  實現按學生成績排序

1.  功能概述

        按學生成績排序功能主要是對學生資訊按英語成績、Python成績、C語言成績或總成績升序或降序排列。例如,輸入功能編號“5”,並且按下<Enter>鍵,系統將先顯示不排序的全部學生資訊。然後提示選擇按程式語言的排序方式(這裡輸入“2”),再選擇降序排序(輸入1),將對學生資訊按Python成績降序排列並顯示。

2.  業務流程

        在實現按學生成績排序功能時,先要梳理出它的業務流程和實現技術,如下圖所示。

Python專案開發案例(一)————學生資訊管理系統

3.  具體實現

        編寫主函式中呼叫的排序的函式sort()。在該函式中,首先判斷儲存學生資訊的檔案是否存在,如果存在,則開啟該檔案讀取全部學生資訊,並將每一名學生資訊轉換為字典儲存到一個新的列表中,然後獲取使用者輸入的排序方式,再根據選擇結果進行相應的排序,最後呼叫show_student()函式顯示排序結果。sort()函式的具體程式碼如下:

def sort():
    show()
    if os.path.exists(filename):
         with open(filename,'r') as file:
             student_old = file.readlines()
             student_new = []
         for list in student_old:
             d = dict(eval(list))             #字串轉字典
             student_new.append(d)            #將轉換後的字典新增到列表中
    else:
        return
    ascORdesc = input("請選擇(0升序;1降序):")
    if ascORdesc == "0":                      #按升序排序
         ascORdescBool = False
    elif ascORdesc == "1":
         ascORdescBool = True                 #按降序排序
    else:
         print()
         sort()
    mode = input()
    if mode == "1":                           #按英語成績排序
         student_new.sort(key=lambda x: x["english"],reverse=ascORdescBool)
    elif mode == "2":                         #按Python成績排序
         student_new.sort(key=lambda x: x["python"],reverse=ascORdescBool)
    elif mode == "3":                         #按C語言成績排序
         student_new.sort(key=lambda x: x["c"],reverse=ascORdescBool)
    elif mode == "0":                         #按總成績排序
         student_new.sort(key=lambda x: x["english"]+x["python"]+x["c"],reverse=ascORdescBool)
    else:
         print(“您的輸入有誤,請重新輸入!”)
         sort()
    show_student(student_new)                 #顯示排序結果

上面的程式碼中,呼叫列表的sort()方法實現的排序,在排序時,通過lambda表示式指定的排序規則。例如,第22行程式碼中的"key=lambda x: x["english"]"表示按字典的english鍵進行排序;“reverse = ascORdescBool”表示是否為降序排序,標記變數ascORdescBool的值為True,表示降序排序。

1.8  打包為.exe可執行檔案

        Python專案完成後,可以將其打包成一個.exe可執行檔案,這樣就可以在其他計算機上執行該專案了,即時這臺計算機上沒有安裝Python開發環境。

        實現打包.exe可執行檔案時,需要使用PyInstaller模組,該模組為第三方模組所以需要單獨安裝。PyInstaller模組支援多種作業系統,如Windows、Linux、Mac OS X等,但是該模組並不支援跨平臺操作。例如:在Windows作業系統下打包的.exe可執行檔案,該檔案就只能在Windows環境下執行。

        這裡以Windows作業系統為例,介紹PyInstaller模組的安裝,安裝PyInstaller模組最簡單的方法就是在“命令提示符視窗”中輸入“pip install pyinstaller”命令進行安裝,如圖所示。如果是升級或者是更新可以使用“pip install --upgrade pyinstaller”命令。

  • 在Windows作業系統中,使用pip或者easy_install安裝PyInstaller模組時,會自動安裝PyWin32。
  • PyInstaller模組安裝完成以後,可以在“命令提示符視窗”中輸入“pyinstaller--version”命令,通過查詢PyInstaller模組版本的方式檢測安裝是否成功。

PyInstaller模組安裝完成以後,就可以打包.py檔案為.exe檔案了。具體方法如下。

(1)通過CMD命令開啟“命令提示符”視窗,在當前游標位置輸入:pyinstaller+-F+(要打包的.py檔案的絕對路徑),例如,該檔案儲存在“”目錄中,則可以使用下面的程式碼對其打包:

                       pyinstaller  -F  E:\tmp\studentsystem\studentsystem.py

  • 在上面的程式碼中,引數-F表示只生成一個副檔名為.exe的可執行檔案。

(2)輸入上面的程式碼並按下<Enter>鍵,將自動生成.exe可執行檔案,具體過程如圖所示。

(3)在如圖所示的位置,找到.exe檔案的儲存路徑,並且在該路徑下找到生成.exe可執行檔案,雙擊該檔案即可執行本專案。

  • 在介紹的PyInstaller模組打包程式中,不能把專案中應用的圖片、文字檔案、音訊、視訊等資源打包到可執行檔案中。因此,在打包後還需要把這些資源複製到與可執行檔案相同的目錄中。 

1.9  小結

        本節主要使用Python語言開發了一個學生資訊管理系統,專案的核心是對檔案、列表和字典進行操作。其中,對檔案進行操作是用來永久儲存學生資訊;而將學生資訊以字典的形式儲存到列表中,是為了方便對學生資訊的查詢、修改和刪除。通過本節的學習,讀者首先應該熟練並掌握對檔案進行建立、開啟和修改等操作的方法,其次還應該掌握對字典和列表進行操作的方法,尤其是對列表進行自定義排序規則,這是本專案的難點,需要讀者仔細體會並做到融會貫通。