
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()