系统运维
512
#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位随机验证码