简单的学生信息管理系统案例分享
本帖最后由 滚石唱片 于 2021-2-1 19:55 编辑初学Python2个多月,按照书中内容敲打了这个案例分享学习经验及个人总结
该案例使用re模块及os模块,以及文件的读写,基本基础知识能够玩转,鉴于尚未学到打包成.exe文件,虽然案例书中有讲,综合我的学习进度,我就不封装了,需要打包的可查看python的PyInstaller模块,这里就不做概述了,毕竟我也才开始学,欢迎大佬们批评指正。
功能简介:
添加学生及成绩信息;
将学生信息保存到文件中;
修改和删除学生信息;
查询学生信息,
根据学生成绩进行排序;
统计学生的总分.
截图信息:
import re
import os
filename = "students.txt" # 数据文件
def menu():
"""输出菜单"""
print("""
┏———————————————学生信息管理系统——————————————┓
| |
| |
| =========功能菜单======= |
| |
| |
| 1 录入学生信息 |
| 2 查找学生信息 |
| 3 删除学生信息 |
| 4 修改学生信息 |
| 5 排序 |
| 6 统计学生总人数 |
| 7 显示所有学生信息 |
| 0 退出系统 |
| |
| |
| |
| ==================== |
| 说明:通过数字或 ↑↓方向键选择菜单 |
| |
| |
| |
| |
| |
└—————————————学生信息管理系统————————————————┘
""")
# key按键
def main(): # 用户选择功能实现的类
"""创建一个学生信息管理系统"""
ctrl = True# 立flag
while (ctrl):
menu() #调用打印菜单的函数 首次显示初始化菜单,让用户输入对应序列号,
option = input("请选择功能") #将用户选择的功能给一个变量 0-7用户输入的值赋给一个变量,便于判断
option_str = re.sub("\D", "", option) # re.sub("\D") 的作用是当用户输入了非数字是直接剔除,继续循环让用户输入对应数字
if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
option_int = int(option_str) # 将列表内的字符串内容转换为数字,进行接下来的判断
if option_str == 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()
def insert():
stdentList = [] # 学生列表,默认为空
mark =True
while mark:
id = input("请输入ID(如1001):")
if not id:
break
name = input("请输入名字:")
if not name:
break
try: # 条件满足,执行录入成绩进入系统
english = int(input("请输入英语成绩:"))
python = int(input("请输入python成绩:"))
c = int(input("请输入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("学生信息录入完毕!!!")
def save(student):
try:
students_txt = open(filename,'a') # 以追加模式打开
except Exception as e:
students_txt = open(filename,'w')# 文件不存在,创建文件并打开
for info in student:
students_txt.write(str(info)+'\n') # 按行存储,添加换行符
students_txt.close() # 关闭文件
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 != "":# 判断是否按ID查询
if d['id']== id:
student_query.append(d) # 将找到的学生信息保存到列表中
elif name != "": # 判断是否按名字查询
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
def delete():
mark = True
while mark: # 标记是否循环
studentId = input("请输入要删除的学生ID:")
if studentId !="": # 判断是否输入要删除的学生
if not os.path.exists(filename):# 判断文件是否存在
continue
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# 退出删除学生信息功能
# 具体实现
def modify(): # 显示全部学生信息
show() # 判断文件是否存在
if not os.path.exists(filename):
return
else:
with open(filename,'r') as rfile: # 打开文件
student_old = rfile.readlines()# 读取全部文件
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"] = input("请输入英语成绩: ")
d["c"] = input("请输入C成绩: ")
except:
print("您的输入有误,请重新输入。")
else:
break # 跳出循环
student = str(d) # 将字典转换为字符串
wfile.write(student +'\n') # 将修改的信息写入到文件
print("修改成功!")
else:
wfile.write(student) # 将未修改的信息写入到文件
mark = input("是否继续修改其它学生信息?(y/n):")
if mark =="y":
modify()# 重新执行操作
#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("请选择排序方式(1.按英语成绩排序;"
# "2.按Python成绩排序;3.按C语言成绩排序;0。按总成绩排序):")
# if mode == "1":# 按英语成绩排序
# student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool)
# elif mode == "2":
# student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
# elif mode == "3":
# 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)# 显示排序结果
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("请选择排序方式(1.按英语成绩排序;"
"2.按Python成绩排序;3.按C语言成绩排序;0。按总成绩排序):")
if mode == "1":# 按英语成绩排序
student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool)# key 是按键详情字典有讲
elif mode == "2":
student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
elif mode == "3":
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)# 显示排序结果
def total():
if os.path.exists(filename):# 判断文件是否存在
with open(filename, 'r')as rfile:# 打开文件
student_old = rfile.readlines()# 读取全部内容
if student_old:
print("一共有%d 名学生!" % len(student_old))# 统计学生人数
else:
print("还没有录入学生信息!")
else:
print("暂未保存数据信息....")
# 将保存到列表中的学生信息显示出来
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("暂未保存数据信息....")
def show_student(studentList):
if not studentList: # 如果没有要显示的数据
print("(o@.@o)无数据信息(o@.@o) \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{:^8}\t{:^10}\t{:^10}\t{:^10}"
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)))
if __name__ == "__main__":
main()
感谢分享 谢谢楼主,现在去试试 楼主没用pycharm吗 楼主,我打完包发到软件区可以吗,备注原帖地址 arq2020 发表于 2021-2-1 20:20
楼主,我打完包发到软件区可以吗,备注原帖地址
可以的,我也是照着书敲的,呵呵 沉心云 发表于 2021-2-1 20:10
楼主没用pycharm吗
都有vscode,pycharm都在学着用 谢谢分享 挺好的小例程,谢谢分享
不过跑起来好像有小错误 正好去运行试试
页:
[1]
2