#import matplotlib.pyplot as plt
import time
import os # 导入文件 包
import re # 正则表达式
filename = 's.txt'
filenamedl = 'sdl.txt'
def main():
while True: # 让菜单反复显示,相当于一个死循环
menu()
option = input("请选择:")
if option == '1':
insert()
elif option == '2':
search()
elif option == '3':
delete()
elif option == '4':
# modify_info()
modify()
elif option == '5':
sort()
elif option == '6':
total()
elif option == '7':
show()
else:
print('你已经退出')
exit(0)
def menu():
print('''
**********学生信息管理系统**********
功能菜单
1.录入学生信息
2.查找学生信息
3.删除学生信息
4.修改学生信息
5.学生成绩排序
6.统计学生人数
7.显示学生信息
0.退出系统
*********************************
''')
def insert(): # 录入
studentlist = [] # 用于保存多个学生信息
flag = 1 # 定义一个标志性变量用来控制循环
while flag: # 相当于while flag!=0
id = input("id:")
if len(id) != 11:
print("id格式错误,请重新输入")
break
name = input("名字:")
if id.lstrip() == '' or name.lstrip() == '': # 判断输入是否为空 用lstrip函数
print("姓名不能为空,输入错误")
break
name_string = re.sub("\D", "", name) # D:切割字符串,只保留数字 d相反
if name_string in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
print("姓名输入出错,请重新输入")
continue
else:
try: # try里面如果有异常,则执行except里面的
yuwen = float(input("语文:"))
if yuwen > 100 or yuwen < 0:
print("成绩输入不合法,请重新输入")
return
shuxue = float(input("数学:"))
if shuxue > 100 or shuxue < 0:
print("成绩输入不合法,请重新输入")
return
yingyu = float(input("英语:"))
if yingyu > 100 or yingyu < 0:
print("成绩输入不合法,请重新输入")
return
except:
print("输入无效,请重新输入")
continue # 若程序执行到此处,下面的内容不继续执行,程序会自动结束本次循环,然后继续输入
student = {'id': id, 'name': name, 'yuwen': yuwen, 'shuxue': shuxue, 'yingyu': yingyu} # 准备一个学生的格式
studentlist.append(student) # 录入一个学生信息就将该学生信息(字典)添加到列表中 将多个学生成绩放入列表
flag = int(input("是否继续输入(1:是/0;否):\n"))
# 保存文件
student_txt = open(filename, 'a') # "a"追加
# 将本次添加的学生信息全部放入到文件中
for s in studentlist: # 遍历列表
student_txt.write(str(s) + '\n') # 写入一行数据 #str表示将列表转成字符串
student_txt.close() # 关闭文件对象
def search():
student_new = []
flag = 1
while flag:
id = ''
name = ''
# d = {}
mode = input("按照id查询输入1/按照姓名查询输入2\n")
if mode == "1":
id = input("请输入学生id:")
elif mode == "2":
name = input("请输入姓名:")
else:
print("输入出错,请重新输入")
continue # 结束本次循环,继续输入
# 读取文件
if os.path.exists(filename): # 判断文件是否存在
with open(filename, 'r') as file: # r表示读取文件filename将其放入file中,文件指针放在文件的开头
studentlist = file.readlines() # 将file中的数据一行一行地读到studentlist中
for list in studentlist: # 遍历列表:将studentlist中的数据添加到list中
d = dict(eval(list)) # eval:转成字符串,dict:转字典
if id != '':
if d['id'] == id:
student_new.append(d) # 如果d里面有信息,将信息放入stdent_new中
if name != '':
if d['name'] == name:
student_new.append(d)
# 打印搜索结果
printData(student_new) # 调用函数
student_new.clear() # 清除上一次的搜索记录
flag = int(input("是否继续查询(1:是/0;否):\n"))
else:
print("无数据")
def delete():
show()
flag = 1
while flag:
id1 = input("请输入需要删除的学生的id:")
if id1 != '':
# 读取所有学生信息
if os.path.exists(filename): # 判断
with open(filename, 'r') as file1: # 以读的方式打开filename将其放入file1中
student2 = file1.readlines() # 将file1中的数据一行一行地读到student2中
else:
student2 = [] # 定义一个空列表
flag1 = False
if student2:
with open(filename, 'w') as file2: #
d = {} # 定义一个空字典
for s in student2: # 遍历列表:将student2中的数据添加到s中
d = dict(eval(s)) # eval:转字符串 dict:转字典. 得到一个学生字典
if d['id'] != id1: # id不相等的将其写入实现删除
file2.write(str(d) + '\n')
else:
flag1 = True
if flag1:
print("id为" + id1 + "的学生已经被删除")
else:
print("没有找到id为" + id1 + "的同学")
else:
print("无该学生信息")
# continue
flag = int(input("是否继续删除(1:是/0;否):"))
def modify():
show()
flag = 1
while flag:
id1 = input("请输入要修改学生的id")
if os.path.exists(filename):
with open(filename, 'r') as file1:
student2 = file1.readlines()
else:
return
with open(filename, 'w') as file2:
d = {}
for s in student2:
d = dict(eval(s)) # 得到一个学生字典
if d["id"] == id1: # 符合条件
while 1:
try: # 若输入为空
d["name"] = input("请输入修改后的姓名")
d["yuwen"] = float(input("请输入修改后的语文成绩"))
d["shuxue"] = float(input("请输入修改后数学成绩"))
d["yingyu"] = float(input("请输入修改后的英语成绩"))
except:
print("输入无效,请重新输入")
else:
break
file2.write(str(d) + "\n")
print("修改成功")
else:
file2.write(str(d) + "\n")
flag = int(input("是否继续修改(1:是/0;否):"))
def sort():
student_new = []
if os.path.exists(filename):
# 打开文件,读取数据
with open(filename, 'r') as file:
studentlist = file.readlines() # 字符串
# 将字符串转成dict存到列表中
for list in studentlist:
student_new.append(eval(list))
# 排序
a = input("1:升序,2:降序")
if a == '1':
a = False
else:
a = True
b = input("请选择排列方式(1语文,2数学,3英语,4总成绩)")
if b == "1":
student_new.sort(key=lambda x: float(x['yuwen']), reverse=a)
elif b == "2":
student_new.sort(key=lambda x: float(x['shuxue']), reverse=a)
elif b == "3":
student_new.sort(key=lambda x: float(x['yingyu']), reverse=a)
else:
student_new.sort(key=lambda x: float(x['yuwen']) + float(x['shuxue']) + float(x['yingyu']), reverse=a)
if student_new:
printData(student_new)
def total():
student_new = []
if os.path.exists(filename):
# 打开文件,读取数据
with open(filename, 'r') as file:
studentlist = file.readlines() # 字符串
if studentlist:
print("一共有%d名学生" % len(studentlist))
else:
print("没有录入学生")
else:
print("未找到文件")
def show(): # 打开文件读取数据
student_new = []
if os.path.exists(filename): # 判断出文件是否存在
# 打开文件,读取数据
with open(filename, 'r') as file: # 将filename中的东西读到file中
studentlist = file.readlines() # 将file中的数据一行一行地读到sdentlist中字符串
# 将字符串转成dict存到列表中
for list in studentlist:
student_new.append(eval(list)) #
if student_new: #
printData(student_new)
# 注意这个函数可以用来计算语数外的总分,还可绘图,绘图我已经注释掉了
def tongji():
sum_chinese = 0
sum_math = 0
sum_english = 0
if os.path.exists(filename): # 判断出文件是否存在
# 打开文件,读取数据
with open(filename, 'r') as file: # 将filename中的东西读到file中
studentlist = file.readlines() # 将file中的数据一行一行地读到sdentlist中字符串
# 将字符串转成dict存到列表中
for list in studentlist:
d = {}
d = dict(eval(list))
sum_chinese += d['yuwen']
sum_math += d['shuxue']
sum_english += d['yingyu']
print("语文总分为:", sum_chinese, "数学总分为:", sum_math, "英语总分为:", sum_english)
sum = sum_chinese + sum_math + sum_english
labels = 'Chinese', 'math', 'English' # 自定义标签
sizes = [sum_chinese / sum, sum_math / sum, sum_english / sum] # 每个标签占多大
explode = (0.05, 0.05, 0.05) # 将某部分爆炸出来
#plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)
# autopct,圆里面的文本格式,%1.1f%%表示小数有1位,整数有一位的浮点数
# shadow,饼是否有阴影
# startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
#plt.axis('equal') # 设置x,y轴刻度一致,这样饼图才能是圆的
#plt.show()
def printData(student_new): #
s = "{:^12}{:^13}\t{:^7}{:^7}\t{:^7}\t{:^7}"
print(s.format("ID", "名字", "语文", "数学", "英语", "总成绩"))
for info in student_new:
y = "{:^6}{:^13}\t{:^8}{:^8}\t{:^8}\t{:^10}"
print(y.format(info.get('id'),
str(info.get('name')),
str(info.get('yuwen')),
str(info.get('shuxue')),
str(info.get('yingyu')),
str(float(info.get('yuwen')) + float(info.get('shuxue')) + float(info.get('yingyu')))))
if __name__ == '__main__': # 程序入口
def showMessage():
print(" ********************************")
print("* 欢迎使用学生成绩管理系统 *")
print('* ---新建用户请按1--- *')
print('* ---登录帐号请按2--- *')
print('* ---退出程序请按0--- *')
print("********************************")
def newuser():
studentlist = []
while True:
myname = input("请输入新建用户名:")
user[myname] = input('请输入新建密码:')
student = {'myname': myname, 'user[myname]': user[myname]} # 准备账户密码的格式
studentlist.append(student) # 录入一个账户密码信息(字典)添加到列表中
# 保存文件
student_txt = open(filenamedl, 'a', encoding='utf-8') # "a"追加
# 将本次添加的账户信息全部放入到文件中
for s in studentlist: # 遍历列表
student_txt.write(str(s) + "\n") # 写入一行数据 #str表示将列表转成字符串
student_txt.close() # 关闭文件对象
print("注册成功,赶紧登录试试吧")
break
def olderuser():
studentlist = []
list = []
while True:
inname = input('请输入登录用户名:')
inpassword = input('请输入登录密码:')
if os.path.exists(filenamedl): # 判断文件是否存在
with open(filenamedl, 'r', encoding='utf-8') as file3:
studentlist = file3.readlines()
for i in studentlist:
d = dict(eval(i))
list.append(d)
for j in list:
if j['myname'] == inname and j['user[myname]'] == inpassword:
print("登陆中......")
time.sleep(2)
main()
print("账户或密码错误")
else:
print("未创建账户")
break
user = {}
studentlist = []
while True:
showMessage()
myIn = input('---请输入指令代码:')
if myIn in '1':
newuser()
elif myIn in '2':
olderuser()
elif myIn in '0':
print('程序已退出')
break
else:
print('你输入的指令有误,重新输入。')
continue
#
# # 1.拥有"安保系统":密码登录
# # 2:一·id限制输入11位(id重复?) 二·姓名不能为空且里面没有数字 三·语文数学英语成绩不能小于0,不能大于100
# # 3.提高代码利用率:因为这段代码需要反复出现,所以如果我们要提高代码利用率,我们将提取相同代码,放入新方法,因为printData随着student_new改变而改变,故而把student_new当作参数
# # 4:统计图:利用Anaconda绘制统计图使数据更直观
#
# # id重复
# from tkinter import *
# import random
# #定义函数,功能为生成有大写字母、小写字母、数字组成的6位随机验证码
Python学生成绩管理系统
点赞
收藏