import re import sqlite3 import time import os # 数据库类 class StuDB: # 初始化方法 def __init__(self): self.con = sqlite3.connect("pythonTest.db") self.cur = self.con.cursor() # 初始化存储学生信息的表 def initStudentTable(self): try: self.cur.execute(""" CREATE TABLE student ( id INTEGER auto_increment PRIMARY KEY , name CHAR(10) NOT NULL, chinese int NOT NULL, math int NOT NULL, english int NOT NULL ); """) except Exception as e: print(e) finally: StuDB.close(self) # self.con.commit() # if self.cur is not None: # self.cur.close() # if self.con is not None: # self.con.close() # 关闭资源 def close(self): self.con.commit() if self.cur is not None: self.cur.close() if self.con is not None: self.con.close() # 业务区 # 成绩限制值方法 @staticmethod def __enterScore(message): while True: try: score = int(input(message)) if 0 <= score <= 100: break else: print("输入错误,成绩应该在0-100之间") except Exception as e: print(e) print("输入错误,成绩应该在0-100之间") return score # 是否继续方法 @staticmethod def __whetherContinue(cls, str): # 判断是否继续 while True: sr = input("请输入y/n继续" + str + ":").lower() if sr == 'y': if str == '添加': cls.insertStudent() elif str == '删除': cls.deleteStudentById() elif str == '修改': cls.updateStudentById() elif str == '查找': cls.selectStudentById() elif str == '导出': cls.save() break elif sr == 'n': print("退出") break # 判断学号是否存在 @staticmethod def __exists(cls, id): # sql sql = 'select * from student where id = ?' result = cls.cur.execute(sql, (id,)) # print(result.fetchone()[0]) # print(int(result.fetchone())) if len(result.fetchall()) > 0: return True else: return False # 验证增删改查数据是否成功 @staticmethod def __verify(result, str1): # 判断表中改动的行数 if result > 0: # 打印提示信息 print(str1 + "成功!!") else: print(str1 + "失败!!!") # 基元方法 # 添加学生信息 @staticmethod def __insert(cls, id, name, chinese, math, english): # 获取光标对象 cls.__init__() # 编写sql语句 sql = "INSERT INTO student(id,name, chinese,math,english) VALUES (?,?,?,?,?);" try: # 执行sql语句 cls.cur.execute(sql, (id, name, chinese, math, english)) except Exception as e: print(e) print("插入数据出现错误,请检查学生学号是否重复") # 回滚 cls.con.rollback() finally: cls.close() # 课程平均分 def scoreAvg(self): # 获取光标对象 self.__init__() # sql sql = "select avg(chinese),avg(math),avg(english) from student" self.cur.execute(sql) result = self.cur.fetchone() print("语文成绩平均是:%.2f" % result[0]) print("数学成绩平均是:%.2f" % result[1]) print("英语成绩平均是:%.2f" % result[2]) # 课程最高分 def scoreMax(self): # 获取光标对象 self.__init__() # sql sql = "select max(chinese),max(math),max(english) from student" self.cur.execute(sql) result = self.cur.fetchone() print("语文成绩最高是:%.2f" % result[0]) print("数学成绩最高是:%.2f" % result[1]) print("英语成绩最高是:%.2f" % result[2]) # 课程最低分 def scoreMin(self): # 获取光标对象 self.__init__() # sql sql = "select min(chinese),min(math),min(english) from student" self.cur.execute(sql) result = self.cur.fetchone() print("语文成绩最低是:%.2f" % result[0]) print("数学成绩最低是:%.2f" % result[1]) print("英语成绩最低是:%.2f" % result[2]) # 数据导入 def load(self): # 获取光标对象 self.__init__() # 获取文件名 fn = input("请输入导入的文件名:") # 判断文件是否存在 if os.path.exists(fn + ".txt"): with open(fn + ".txt", 'r', encoding='utf-8') as fp: while True: s = fp.readline().strip("\n") # 如果读取不到数据则退出循环 if s == '': break # 以 ,分隔 stu = s.split(',') id = int(stu[0]) name = stu[1] chinese = int(stu[2]) math = int(stu[3]) english = int(stu[4]) if self.__exists(self, id): print("学号为:" + str(id) + " 的学生以存在。") else: self.__insert(self, id, name, chinese, math, english) print("导入完毕") else: print("导入的文件不存在") # 数据导出 def save(self): # 获取光标对象 self.__init__() try: fn = input("请输入要导出的文件名:") with open(fn + ".txt", 'w', encoding='utf-8') as fp: self.cur.execute('select * from student') rows = self.cur.fetchall() for row in rows: fp.write(str(row[0]) + ',') fp.write(row[1] + ',') fp.write(str(row[2]) + ',') fp.write(str(row[3]) + ',') fp.write(str(row[4]) + '\n') # 判断是否导出成功 print("导出成功") # 错误处理 except Exception as e: print(e) print("导出失败") finally: # 关闭资源 self.close() # 是否继续 self.__whetherContinue(self, "导出") # 所有学生信息显示 def selectStudentAll(self): # 获取连接 # 获取光标对象 StuDB.__init__(self) # 字符串格式化输出 format_head = '{:8}\t{:8}\t{:8}\t{:8}\t{:8}' print(format_head.format('学号', '姓名', '语文', '数学', '英语')) # 查询数据的sql语句 sql = "SELECT * FROM student;" # 执行sql语句 self.cur.execute(sql) # 获取多条查询数据 ret = self.cur.fetchall() # 关闭资源 self.close() format_con = '{:^8}\t{:8}\t{:^8}\t{:^8}\t{:^8}' for stu in ret: print(format_con.format(stu[0], stu[1], stu[2], stu[3], stu[4])) # 根据学生 def selectStudentById(self): # 获取连接 # 获取光标对象 StuDB.__init__(self) while True: # 收集学生学号 stuNum = int(''.join([x for x in input("请输入要添加的学生学号:") if x.isdigit()])) # 判断学号是否存在 result = self.__exists(self, stuNum) if result: # 学号已经存在 break else: # 学号不存在 print("学号不存在,请重新输入学号") # 字符串格式化输出 format_head = '{:8}\t{:8}\t{:8}\t{:8}\t{:8}' print(format_head.format('学号', '姓名', '语文', '数学', '英语')) # 查询数据的sql语句 sql = "SELECT * FROM student where id = ?;" try: # 执行sql语句 self.cur.execute(sql, (stuNum,)) # 获取多条查询数据 ret = self.cur.fetchone() format_con = '{:^8}\t{:8}\t{:^8}\t{:^8}\t{:^8}' print(format_con.format(ret[0], ret[1], ret[2], ret[3], ret[4])) except Exception as e: print(e) finally: # 关闭资源 self.close() # 是否继续添加 StuDB.__whetherContinue(self, '查找') # 插入单条学生信息 def insertStudent(self): # print("进入函数") # 得到一个可以执行SQL语句的光标对象 # 连接database StuDB.__init__(self) # 收集用户信息 # 学号收集 while True: stuNum = int(''.join([x for x in input("请输入要添加的学生学号:") if x.isdigit()])) # 判断学号是否存在 result = self.__exists(self, stuNum) # print(result) if result: # 学号已经存在 print("学号已经存在,请修改学号后,重新输入学号") else: # 学号不存在 break name = input("请输入要添加的学生姓名:") chinese = self.__enterScore("请输入改学生的语文成绩") math = self.__enterScore("请输入改学生的数学成绩") english = self.__enterScore("请输入改学生的英语成绩") try: # 执行SQL语句 self.__insert(self, stuNum, name, chinese, math, english) # 打印信息 self.__verify(self.cur.rowcount, "添加") except Exception as e: print(e) # 关闭资源 finally: # 是否继续添加 StuDB.__whetherContinue(self, '添加') # 学生信息删除 def deleteStudentById(self): # 获取连接 # 获取光标对象 StuDB.__init__(self) # 学号收集 id = int(''.join([x for x in input("请输入要删除的学生学号:") if x.isdigit()])) # 判断学号是否存在 try: if self.__exists(self, id): # 学号已经存在,执行删除逻辑 print("正在删除。。。") # sql语句 sql = "DELETE FROM student where id = ?" # 执行sql self.cur.execute(sql, (id,)) # 判断表中改动的行数 # 判断表中改动的行数 self.__verify(self.cur.rowcount, "删除") else: print("对不起,您输入的学号不存在") except Exception as e: # 打印错误 print(e) # 回滚 self.con.rollback() finally: # 释放资源 self.close() # 是否继续删除 StuDB.__whetherContinue(self, '删除') # 修改学生信息 def updateStudentById(self): # 获取连接 # 获取光标对象 self.__init__() # 获取要修改的学生id id = int(''.join([x for x in input("请输入要删除的学生学号:") if x.isdigit()])) # 判断学生id是否存在 # 判断学号是否存在 try: if self.__exists(self, id): # 获取要修改的数据 name = input("请输入要添加的学生姓名:") chinese = self.__enterScore("请输入改学生的语文成绩") math = self.__enterScore("请输入改学生的数学成绩") english = self.__enterScore("请输入改学生的英语成绩") # sql语句 sql = "UPDATE student set name=?,chinese=?,math=?,english=? WHERE id = ?" # 执行修改sql语句 self.cur.execute(sql, (name, chinese, math, english, id)) # 判断表中改动的行数 self.__verify(self.cur.rowcount, "修改") else: print("对不起,您输入的学号不存在") except Exception as e: # 打印错误 print(e) # 回滚 self.con.rollback() finally: # 释放资源 self.close() # 是否继续删除 StuDB.__whetherContinue(self, '修改') # 功能菜单 def menu(): print("============学生信息管理系统==============\n" "| |\n" "| ==============功能菜单==============|\n" "| |\n" "| |\n" "| 1、录入学生信息 |\n" "| 2、查找学生信息 |\n" "| 3、删除学生信息 |\n" "| 4、修改学生信息 |\n" "| 5、查询所有学生信息 |\n" "| 6、各门课程平均分 |\n" "| 7、各门课程最高分 |\n" "| 8、各门课程最低分 |\n" "| 9、导入 |\n" "| 10、导出 |\n" "| 0、退出系统 |\n" "| |\n" "| |\n" "| |\n" "|------------------------------------|\n" "| |\n" "| |\n" ) if __name__ == '__main__': stu = StuDB() stu.initStudentTable() ctrl = True while ctrl: # 打印菜单 menu() # 获取输入 option = input("请选择:") # 正则表达式匹配数字 option_str = re.sub("\D", "", option) if option_str in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']: option_int = int(option_str) if option_int == 0: # 退出系统 print('您已退出学生信息管理系统!') ctrl = False elif option_int == 1: # 录入学生成绩信息 stu.insertStudent() time.sleep(3) elif option_int == 2: # 查找学生成绩信息 stu.selectStudentById() time.sleep(3) elif option_int == 3: # 删除学生成绩信息 stu.deleteStudentById() time.sleep(3) elif option_int == 4: # 修改学生成绩信息 stu.updateStudentById() time.sleep(3) elif option_int == 5: # 查询所有学生信息 stu.selectStudentAll() time.sleep(3) elif option_int == 6: # 各门课程平均分 stu.scoreAvg() time.sleep(3) elif option_int == 7: # 各门课程最高分 stu.scoreMax() time.sleep(3) elif option_int == 8: # 各门课程最低分 stu.scoreMin() time.sleep(3) elif option_int == 9: # 导入数据 stu.load() time.sleep(3) elif option_int == 10: # 导出数据 stu.save() time.sleep(3)