- 文件結構
- 詳細代碼,studentsystem.py
5 # 文件名稱:studentsystem.py 6 # 開發工具:PyCharm 7 import re # 導入正則表達式模塊 8 import os # 導入操作系統模塊 9 10 filename = "students.txt" # 定義保存學生信息的文件名 11 12 13 def menu(): 14 # 輸出菜單 15 print(''' 16 ╔———————學生信息管理系統————————╗ 17 │ │ 18 │ =============== 功能菜單 =============== │ 19 │ │ 20 │ 1 錄入學生信息 │ 21 │ 2 查找學生信息 │ 22 │ 3 刪除學生信息 │ 23 │ 4 修改學生信息 │ 24 │ 5 排序 │ 25 │ 6 統計學生總人數 │ 26 │ 7 顯示所有學生信息 │ 27 │ 0 退出系統 │ 28 │ ========================================== │ 29 │ 說明:通過數字或↑↓方向鍵選擇菜單 │ 30 ╚———————————————————————╝ 31 ''') 32 33 34 def main(): 35 ctrl = True # 標記是否退出系統 36 while (ctrl): 37 menu() # 顯示菜單 38 option = input("請選擇:") # 選擇菜單項 39 option_str = re.sub("\D", "", option) # 提取數字 40 if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']: 41 option_int = int(option_str) 42 if option_int == 0: # 退出系統 43 print('您已退出學生成績管理系統!') 44 ctrl = False 45 elif option_int == 1: # 錄入學生成績信息 46 insert() 47 elif option_int == 2: # 查找學生成績信息 48 search() 49 elif option_int == 3: # 刪除學生成績信息 50 delete() 51 elif option_int == 4: # 修改學生成績信息 52 modify() 53 elif option_int == 5: # 排序 54 sort() 55 elif option_int == 6: # 統計學生總數 56 total() 57 elif option_int == 7: # 顯示所有學生信息 58 show() 59 60 61 '''1 錄入學生信息''' 62 63 64 def insert(): 65 stdentList = [] # 保存學生信息的列表 66 mark = True # 是否繼續添加 67 while mark: 68 id = input("請輸入ID(如 1001):") 69 if not id: # ID為空,跳出循環 70 break 71 name = input("請輸入名字:") 72 if not name: # 名字為空,跳出循環 73 break 74 try: 75 english = int(input("請輸入英語成績:")) 76 python = int(input("請輸入Python成績:")) 77 c = int(input("請輸入C語言成績:")) 78 except: 79 print("輸入無效,不是整型數值....重新錄入信息") 80 continue 81 stdent = {"id": id, "name": name, "english": english, "python": python, "c": c} # 將輸入的學生信息保存到字典 82 stdentList.append(stdent) # 將學生字典添加到列表中 83 inputMark = input("是否繼續添加?(y/n):") 84 if inputMark == "y": # 繼續添加 85 mark = True 86 else: # 不繼續添加 87 mark = False 88 save(stdentList) # 將學生信息保存到文件 89 print("學生信息錄入完畢!!!") 90 91 92 # 將學生信息保存到文件 93 def save(student): 94 try: 95 students_txt = open(filename, "a") # 以追加模式打開 96 except Exception as e: 97 students_txt = open(filename, "w") # 文件不存在,創建文件並打開 98 for info in student: 99 students_txt.write(str(info) + "\n") # 按行存儲,添加換行符 100 students_txt.close() # 關閉文件 101 102 103 '''2 查找學生成績信息''' 104 105 106 def search(): 107 mark = True 108 student_query = [] # 保存查詢結果的學生列表 109 while mark: 110 id = "" 111 name = "" 112 if os.path.exists(filename): # 判斷文件是否存在 113 mode = input("按ID查輸入1;按姓名查輸入2:") 114 if mode == "1": 115 id = input("請輸入學生ID:") 116 elif mode == "2": 117 name = input("請輸入學生姓名:") 118 else: 119 print("您的輸入有誤,請重新輸入!") 120 search() # 重新查詢 121 with open(filename, 'r') as file: # 打開文件 122 student = file.readlines() # 讀取全部內容 123 for list in student: 124 d = dict(eval(list)) # 字符串轉字典 125 if id is not "": # 判斷是否按ID查 126 if d['id'] == id: 127 student_query.append(d) # 將找到的學生信息保存到列表中 128 elif name is not "": # 判斷是否按姓名查 129 if d['name'] == name: 130 student_query.append(d) # 將找到的學生信息保存到列表中 131 show_student(student_query) # 顯示查詢結果 132 student_query.clear() # 清空列表 133 inputMark = input("是否繼續查詢?(y/n):") 134 if inputMark == "y": 135 mark = True 136 else: 137 mark = False 138 else: 139 print("暫未保存數據信息...") 140 return 141 142 143 '''3 刪除學生成績信息''' 144 145 146 def delete(): 147 mark = True # 標記是否循環 148 while mark: 149 studentId = input("請輸入要刪除的學生ID:") 150 if studentId is not "": # 判斷要刪除的學生是否存在 151 if os.path.exists(filename): # 判斷文件是否存在 152 with open(filename, 'r') as rfile: # 打開文件 153 student_old = rfile.readlines() # 讀取全部內容 154 else: 155 student_old = [] 156 ifdel = False # 標記是否刪除 157 if student_old: # 如果存在學生信息 158 with open(filename, 'w') as wfile: # 以寫方式打開文件 159 d = {} # 定義空字典 160 for list in student_old: 161 d = dict(eval(list)) # 字符串轉字典 162 if d['id'] != studentId: 163 wfile.write(str(d) + "\n") # 將一條學生信息寫入文件 164 else: 165 ifdel = True # 標記已經刪除 166 if ifdel: 167 print("ID為 %s 的學生信息已經被刪除..." % studentId) 168 else: 169 print("沒有找到ID為 %s 的學生信息..." % studentId) 170 else: # 不存在學生信息 171 print("無學生信息...") 172 break # 退出循環 173 show() # 顯示全部學生信息 174 inputMark = input("是否繼續刪除?(y/n):") 175 if inputMark == "y": 176 mark = True # 繼續刪除 177 else: 178 mark = False # 退出刪除學生信息功能 179 180 181 '''4 修改學生成績信息''' 182 183 184 def modify(): 185 show() # 顯示全部學生信息 186 if os.path.exists(filename): # 判斷文件是否存在 187 with open(filename, 'r') as rfile: # 打開文件 188 student_old = rfile.readlines() # 讀取全部內容 189 else: 190 return 191 studentid = input("請輸入要修改的學生ID:") 192 with open(filename, "w") as wfile: # 以寫模式打開文件 193 for student in student_old: 194 d = dict(eval(student)) # 字符串轉字典 195 if d["id"] == studentid: # 是否為要修改的學生 196 print("找到了這名學生,可以修改他的信息!") 197 while True: # 輸入要修改的信息 198 try: 199 d["name"] = input("請輸入姓名:") 200 d["english"] = int(input("請輸入英語成績:")) 201 d["python"] = int(input("請輸入Python成績:")) 202 d["c"] = int(input("請輸入C語言成績:")) 203 except: 204 print("您的輸入有誤,請重新輸入。") 205 else: 206 break # 跳出循環 207 student = str(d) # 將字典轉換為字符串 208 wfile.write(student + "\n") # 將修改的信息寫入到文件 209 print("修改成功!") 210 else: 211 wfile.write(student) # 將未修改的信息寫入到文件 212 mark = input("是否繼續修改其他學生信息?(y/n):") 213 if mark == "y": 214 modify() # 重新執行修改操作 215 216 217 '''5 排序''' 218 219 220 def sort(): 221 show() # 顯示全部學生信息 222 if os.path.exists(filename): # 判斷文件是否存在 223 with open(filename, 'r') as file: # 打開文件 224 student_old = file.readlines() # 讀取全部內容 225 student_new = [] 226 for list in student_old: 227 d = dict(eval(list)) # 字符串轉字典 228 student_new.append(d) # 將轉換后的字典添加到列表中 229 else: 230 return 231 ascORdesc = input("請選擇(0升序;1降序):") 232 if ascORdesc == "0": # 按升序排序 233 ascORdescBool = False # 標記變量,為False表示升序排序 234 elif ascORdesc == "1": # 按降序排序 235 ascORdescBool = True # 標記變量,為True表示降序排序 236 else: 237 print("您的輸入有誤,請重新輸入!") 238 sort() 239 mode = input("請選擇排序方式(1按英語成績排序;2按Python成績排序;3按C語言成績排序;0按總成績排序):") 240 if mode == "1": # 按英語成績排序 241 student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool) 242 elif mode == "2": # 按Python成績排序 243 student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool) 244 elif mode == "3": # 按C語言成績排序 245 student_new.sort(key=lambda x: x["c"], reverse=ascORdescBool) 246 elif mode == "0": # 按總成績排序 247 student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse=ascORdescBool) 248 else: 249 print("您的輸入有誤,請重新輸入!") 250 sort() 251 show_student(student_new) # 顯示排序結果 252 253 254 ''' 6 統計學生總數''' 255 256 257 def total(): 258 if os.path.exists(filename): # 判斷文件是否存在 259 with open(filename, 'r') as rfile: # 打開文件 260 student_old = rfile.readlines() # 讀取全部內容 261 if student_old: 262 print("一共有 %d 名學生!" % len(student_old)) 263 else: 264 print("還沒有錄入學生信息!") 265 else: 266 print("暫未保存數據信息...") 267 268 269 ''' 7 顯示所有學生信息 ''' 270 271 272 def show(): 273 student_new = [] 274 if os.path.exists(filename): # 判斷文件是否存在 275 with open(filename, 'r') as rfile: # 打開文件 276 student_old = rfile.readlines() # 讀取全部內容 277 for list in student_old: 278 student_new.append(eval(list)) # 將找到的學生信息保存到列表中 279 if student_new: 280 show_student(student_new) 281 else: 282 print("暫未保存數據信息...") 283 284 285 # 將保存在列表中的學生信息顯示出來 286 def show_student(studentList): 287 if not studentList: 288 print("(o@.@o) 無數據信息 (o@.@o) \n") 289 return 290 format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}" 291 print(format_title.format("ID", "名字", "英語成績", "Python成績", "C語言成績", "總成績")) 292 format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}" 293 for info in studentList: 294 print(format_data.format(info.get("id"), info.get("name"), str(info.get("english")), str(info.get("python")), 295 str(info.get("c")), 296 str(info.get("english") + info.get("python") + info.get("c")).center(12))) 297 298 299 if __name__ == "__main__": 300 main()