![]()
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()