import os
def menu():
print('==============================学生管理系统==============================')
print('-------------------------------功能菜单--------------------------------')
print('\t\t\t\t\t\t\t1.录入学生信息')
print('\t\t\t\t\t\t\t2.查找学生信息')
print('\t\t\t\t\t\t\t3.删除学生信息')
print('\t\t\t\t\t\t\t4.修改学生信息')
print('\t\t\t\t\t\t\t5.排序')
print('\t\t\t\t\t\t\t6.统计学生总人数')
print('\t\t\t\t\t\t\t7.显示所有学生信息')
print('\t\t\t\t\t\t\t8.清除所有学生信息')
print('\t\t\t\t\t\t\t0.退出')
def insert():
while True:
while True:
i_d = input('请输入ID')
if not i_d:
continue
break
while True:
name = input('请输入姓名')
if not name:
continue
break
sub_modify(i_d, name)
while True:
ans = input('是否继续添加?y/n')
if ans.lower() == 'y' or ans.lower() == 'n':
break
else:
print('请输入正确的符号')
if ans == 'n':
print('学生信息录入完毕')
break
def sub_modify(i_d, name):
while True:
try:
eng_grade = int(input('请输入英语成绩'))
if not eng_grade:
continue
break
except ValueError:
print('请输入正确的数据')
continue
while True:
try:
pyt_grade = int(input('请输入Python成绩'))
if not pyt_grade:
continue
break
except ValueError:
print('请输入正确的数据')
continue
while True:
try:
jav_grade = int(input('请输入Java成绩'))
if not jav_grade:
continue
break
except ValueError:
print('请输入正确的数据')
continue
key = ['id', 'name', 'English_grade', 'Python_grade', 'Java_grade', 'total_grade']
value = [i_d, name, eng_grade, pyt_grade, jav_grade, eng_grade + pyt_grade + jav_grade]
zz = zip(key, value)
# dic = {i: j for i, j in zz}
dic = dict(zz)
save(dic)
def save(dic): # 用于在文件后侧添加新的信息
with open('Info.txt', mode='a', encoding='UTF-8') as file:
file.write(str(dic)) # 只能读入字符串
file.write('\n')
def search():
if not os.path.exists('Info.txt'):
print('文件不存在')
return
with open('Info.txt', mode='r', encoding='UTF-8') as r_file:
lst = r_file.readlines()
if not lst:
print('没有可查找的对象')
return
while True:
ans = int(input('按照学号搜索请输入0,按照姓名搜索请输入1'))
if not ans:
inq = input('请输入学号')
for it in lst:
dic = eval(it)
if dic['id'] == inq:
print(it)
break
else:
print('没有该学生')
else:
inq = input('请输入姓名')
for it in lst:
dic = eval(it)
if dic['name'].lower() == inq.lower():
print(it)
break
else:
print('没有该学生')
ans = input('是否继续寻找?y/n')
if ans.lower() == 'y':
continue
elif ans.lower() == 'n':
break
def delete():
if not os.path.exists('Info.txt'):
with open('Info.txt', mode='w', encoding='UTF-8') as r_file:
r_file.write('')
else:
while True:
with open('Info.txt', mode='r', encoding='UTF-8') as r_file: # w+会直接将原文件覆盖掉 r+指针在开头 a+指针在末尾 r要求文件必须存在
lst = r_file.readlines() # 是按照字符串读出来的
if not lst: # 空对象bool值为False
print('文件为空,无法删除')
break
while True:
while True:
# show()
try:
i = int(input('按照学号索引请输入0,按照姓名索引请输入1'))
break
except ValueError:
continue
flag = False
if i == 0:
clear()
i_d = input('请输入学号')
for item in lst: # 使用遍历的方法
dic = eval(item) # eval可以去掉引号 很重要 dic是字典类型 eval将字符串转成了字典
if dic['id'] != i_d:
save(dic)
else:
flag = True
break
elif i == 1:
clear()
na_me = input('请输入姓名')
for item in lst: # 使用遍历的方法
dic = eval(item) # eval可以去掉引号 很重要 dic是字典类型
if dic['name'].lower() != na_me.lower(): # 不区分大小写
save(dic) # item是字符串类型自带\n
else:
flag = True
break
else:
print('请输入正确的字符')
continue
if flag:
print('删除成功')
if not flag:
print('没有此学生')
# show()
ans = input('是否继续?y/n')
if ans.lower() == 'n':
break
elif ans.lower() == 'y':
continue
def modify():
if not os.path.exists('Info.txt'):
print('文件不存在')
return
else:
while True:
with open('Info.txt', mode='r', encoding='UTF-8') as r_file:
ls = r_file.readlines()
if not ls:
print('文件为空')
return
else:
i_d = input('请输入修改学生学号:')
flag = False
clear()
for item in ls:
dic = eval(item)
if dic['id'] == i_d:
print('该学生的姓名是' + dic['name'])
sub_modify(i_d, dic['name'])
print('修改成功')
flag = True
else:
save(dic)
if not flag:
print('没有找到该学生')
ans = input('是否继续?y/n')
if ans.lower() == 'y':
continue
elif ans.lower() == 'n':
break
def sort():
if not os.path.exists('Info.txt'):
print('文件不存在')
return
with open('Info.txt', mode='r', encoding='UTF-8') as r_file:
lst = r_file.readlines()
if not lst:
print('文件为空')
return
is_reverse = bool(int(input('请选择排序方式,0.升序,1.降序')))
subject = int(input('请输入排序科目,0.英语,1.Python,2.Java, 3.平均分'))
if subject == 0:
lst.sort(key=lambda x: int(eval(x)['English_grade']), reverse=is_reverse)
for it in lst:
print(it, end='')
elif subject == 1:
lst.sort(key=lambda x: int(eval(x)['Python_grade']), reverse=is_reverse)
for it in lst:
print(it, end='')
elif subject == 2:
lst.sort(key=lambda x: int(eval(x)['Java_grade']), reverse=is_reverse)
for it in lst:
print(it, end='')
elif subject == 3:
lst.sort(
key=lambda x: int(eval(x)['total_grade']),
reverse=is_reverse)
for it in lst:
print(it, end='')
def calc():
if not os.path.exists('Info.txt'):
print('文件不存在')
return
with open('Info.txt', mode='r', encoding='UTF-8') as r_file:
lst = r_file.readlines()
print(f'一共有{len(lst)}个学生')
def show():
file = open('Info.txt', mode='r', encoding='UTF-8')
print(file.read())
file.close()
def clear():
file = open('Info.txt', mode='w', encoding='UTF-8')
file.write('')
file.close()
def main():
while True:
menu()
try:
choice = int(input('请选择功能'))
if choice in [0, 1, 2, 3, 4, 5, 6, 7, 8]:
if choice == 0:
while True:
answer = input('您确定要退出系统吗?y/n')
if answer == 'y' or answer == 'n':
break
else:
print('请输入正确的字符')
if answer == 'y':
print('感谢您的使用')
break
elif answer == 'n':
continue
elif choice == 1:
insert()
elif choice == 2:
search()
elif choice == 3:
delete()
elif choice == 4:
modify()
elif choice == 5:
sort()
elif choice == 6:
calc()
elif choice == 7:
show()
elif choice == 8:
ans = input('您确定要清除所有学生信息吗?y/n')
if ans == 'y':
clear()
elif ans == 'n':
continue
else:
print('请输入正确的字符')
except ValueError:
print('请输入正确的字符\n')
if __name__ == '__main__':
main()