# -*-coding:utf8-*-
# 学生管理系统完整版
# 学生信息管理项目,要求带操作界面,并完成每项操作:
# +----------------------+
# | 1)添加学生信息 |
# | 2)显示所有学生的信息 |
# | 3)删除学生信息 |
# | 4)修改学生信息 |
# | 5)按学生成绩高-低显示学生信息 |
# | 6)按学生成绩低-高显示学生信息 |
# | 7)按学生年龄高-低显示学生信息 |
# | 8)按学生年龄低-高显示学生信息 |
# | 9)保存学生信息到文件(students.txt) |
# | 10)从文件中读取数据(students.txt) |
# | 退出:其他任意按键<回车> |
# +----------------------+
def menu():
menu_info = '''+----------------------+
| 1)添加学生信息 |
| 2)显示所有学生的信息 |
| 3)删除学生信息 |
| 4)修改学生信息 |
| 5)按学生成绩高-低显示学生信息 |
| 6)按学生成绩低-高显示学生信息 |
| 7)按学生年龄高-低显示学生信息 |
| 8)按学生年龄低-高显示学生信息 |
| 9)保存学生信息到文件(students.txt) |
| 10)从文件中读取数据(students.txt) |
| 退出:其他任意按键<回车> |
+----------------------+
'''
print(menu_info)
# 以下两个函数用于sorted排序,key的表达式函数。
def get_age(*l):
for x in l:
return x.get('age') # get() 函数返回指定键的值,如果值不在字典中返回默认值。
def get_score(*l):
for x in l:
return x.get('score')
# 1)添加学生信息
def addstudentinfo():
l = []
while True:
n = input('请输入名字:')
if not n: # 名字为空,跳出循环
break
try:
a = int(input('请输入年龄:'))
s = int(input('请输入成绩:'))
except:
print('输入无效,不是整型数值,重新输入信息')
continue
info = {'name': n, 'age': a, 'score': s}
l.append(info)
print('学生信息录入完毕')
print(l)
return l
# 2)显示所有学生信息
def showstudentinfo(studentinfo):
if not studentinfo:
print('无数据信息')
return
print('名字'.center(8),'年龄'.center(4),'成绩'.center(4))
for info in studentinfo:
print(info.get('name').center(10), str(info.get('age')).center(4), str(info.get('score')).center(4))
#3)删除学生信息
def delstudentinfo(studentinfo):
delname=input('请输入删除的学生姓名:')
for info in studentinfo:
if delname==info.get('name'):#get() 函数返回指定键的值
return info
raise IndexError('学生信息不匹配没有找到%s'%delname)
#4)修改学生信息
def modifystudentinfo(studentinfo):
modifyname=input('请输入要修改的姓名:')
for info in studentinfo:
if modifyname==info.get('name'):
print(info)
studentinfo.remove(info)
name = input('请输入要修改后姓名:')
a=int(input('请输入年龄:'))
s=int(input('请输入成绩:'))
info={'name':name,'age':a,'score':s}
studentinfo.append(info)
return info
raise IndexError('学生信息不匹配没有找到%s' % modifyname)
#5)按学生成绩高-低显示学生信息
def scorereduce(studentinfo):
print('按学生成绩高-低显示:')
mit=sorted(studentinfo,key=lambda x:x['score'],reverse=True)
showstudentinfo(mit)
#6)按学生成绩低-高显示学生信息
def scorerise(studentinfo):
print('按学生成绩低-高显示:')
mit=sorted(studentinfo,key=lambda x:x['score'])
showstudentinfo(mit)
#7)按学生年龄高-低显示学生信息
def agereduce(studentinfo):
print('按学生年龄高-低显示学生信息')
mit=sorted(studentinfo,key=lambda x:x['age'],reverse=True)
showstudentinfo(mit)
#8)按学生年龄低-高显示学生信息
def agerise(studentinfo):
print('按学生年龄低-高显示学生信息')
mit=sorted(studentinfo,lambda x:x['age'])
showstudentinfo(mit)
#9)保存学生信息到文件(student.txt)
def saveinfo(studentinfo):
try:
studenttxt=open('student.txt','w')#以写模式打开,并清空文件内容
except Exception as e:
studenttxt=open('student.txt','x')#文件不存在,创建文件并打开
for info in studentinfo:
studenttxt.write(str(info)+'\n')
print('保存成功')
studenttxt.close()
#10)从文件中读取数据(student.txt)
def readinfo():
oldinfo=[]
try:
studenttxt=open('student.txt')
except:
print('暂未保存数据信息')
return
while True:
info=studenttxt.readline()
if not info:
break
print('读取的数据信息',info)
info=info.rstrip()#掉换行符
print('rstrip', info)
info=info[1:-1]#去掉{}
print('info[1:-1]',info)
studentdict={}#单个学生字典信息
for x in info.split(','):#以,为间隔分拆分
print('x',x)
keyvalue=[]#开辟空间,key_value[0]存key,key_value[0]存value
for k in x.split(':'):#以:为间隔拆分
k=k.strip()#去掉首尾空字符
print('key',k)
if k[0]==k[-1] and len(k)>2:#判断是字符串还是整数
keyvalue.append(k[1:-1])#去掉首尾'
print('str',keyvalue)
else:
keyvalue.append(int(k))
print('keyvalue',keyvalue)
print('keyvalue[0]',keyvalue[0])
print('keyvalue[1]',keyvalue[1])
studentdict[keyvalue[0]]=keyvalue[1]#学生信息添加
print('studentdict',studentdict)
oldinfo.append(studentdict)#所有学生信息汇总
print('读取成功')
studenttxt.close()
return oldinfo
def main():
studentinf=[]
while True:
menu()
number=input('请输入选项:')
if number=='1':
studentinfo=addstudentinfo()
elif number=='2':
showstudentinfo(studentinfo)
elif number=='3':
try:
studentinfo.remove(delstudentinfo(studentinfo))
except Exception as e:
#学生姓名不匹配
print('学生姓名不匹配')
#print(e)
elif number=='4':
try:
student=modifystudentinfo(studentinfo)
except Exception as e:
print('学生姓名不匹配')
#print(e)
elif number=='5':
scorereduce(studentinfo)
elif number=='6':
scorerise(studentinfo)
elif number=='7':
agereduce(studentinfo)
elif number=='8':
agerise(studentinfo)
elif number=='9':
saveinfo(studentinfo)
elif number=='10':
studentinfo=readinfo()
else:
break
input('回主菜单')
main()