【Python编程实战】基于Python语言实现学生信息管理系统
🎩 欢迎来到技术探索的奇幻世界👨💻
📜 个人主页:@一伦明悦-CSDN博客
✍🏻 作者简介: C++软件开发、Python机器学习爱好者
🗣️ 互动与支持:💬评论 👍🏻点赞 📂收藏 👀关注+
如果文章有所帮助,欢迎留下您宝贵的评论,
点赞加收藏支持我,点击关注,一起进步!
目录
前言
正文
01-需求分析
02-功能演示
03-录入学生信息功能实现
04-查找学生信息功能实现
05-删除学生信息功能实现
06-修改学生信息功能实现
07-对学生成绩进行排序功能实现
08-统计学生总人数功能实现
09-显示所有学生信息功能实现
总结
01-整体代码实现
前言
Python是一种高级编程语言,以其简洁易读的语法而闻名。它支持面向对象、命令式、函数式和过程式编程范式。Python由Guido van Rossum于1991年创立,如今已成为最受欢迎的编程语言之一。它在许多领域得到广泛应用,包括Web开发、科学计算、人工智能、数据分析和自动化脚本等。Python的核心特点包括动态类型、自动内存管理和广泛的标准库,其中包含了许多用于各种任务的模块和功能。Python的生态系统也非常丰富,拥有大量的第三方库和框架,使开发人员能够快速构建复杂的应用程序。
正文
01-需求分析
'''学生管理系统应该具备的功能'''
1,添加学生及成绩信息
2,将学生信息保存在文件中
3,修改和删除学生信息4,查询学生信息
5,根据学生成绩进行排序6,统计学生的总分
02-功能演示
下面对系统实现的功能进行演示一下,后面会给出分段代码解释和整体代码
运行之后,界面如下:各种功能选择项
选择功能1,可以进行添加学生信息操作,如下图所示:添加张三和学号,以及各科成绩,最后可以选择是否继续添加。
选择功能2,可以进行查询学生信息,如下图所示:两种查询方式
请选择2
按学号查找请输入1,按姓名查找请输入22
请输入要查找学生的姓名:张三
id 姓名 英语成绩 python成绩 java成绩 总成绩
1001 张三 98 96 99 293
是否继续执行查询操作?y/n
y
按学号查找请输入1,按姓名查找请输入21
请输入要查找学生的id:1001
id 姓名 英语成绩 python成绩 java成绩 总成绩
1001 张三 98 96 99 293
是否继续执行查询操作?y/n
选择功能4,修改学生信息,如下图所示:
请输入需要修改学生的id:1002
找到学生相关信息,可以修改他的相关信息了!!!
请输入名字:李四
请输入英语成绩:100
请输入python成绩:100
请输入java成绩100
修改成功
是否继续修改其他学生的信息?y/n
选择功能5,学生信息排序,如下图所示:也有多种排序方式
请选择5
id 姓名 英语成绩 python成绩 java成绩 总成绩
1001 张三 98 96 99 293
1002 李四 100 100 100 300
请选择(0.升序 1.降序)1
请选择排序方式(1.英语成绩排序 2.python成绩排序 3.java成绩排序 0.总成绩排序)1
id 姓名 英语成绩 python成绩 java成绩 总成绩
1002 李四 100 100 100 300
1001 张三 98 96 99 293
选择功能6,统计学生总人数,如下图所示:
选择功能7,显示所有学生信息,如下图所示:
03-录入学生信息功能实现
1,表示录入学生信息,调用insert()函数,函数如下
代码解释如下:这段代码定义了一个函数insert()
,它的作用是用来录入学生信息并将信息保存到一个列表中,最后将列表保存到文件中。:
-
def insert():
: 这是定义一个函数的开始,函数名为insert
。 -
student_list = []
: 创建一个空列表student_list
,用于存储录入的学生信息。 -
while True:
: 进入一个无限循环,用于不断地录入学生信息,直到用户选择退出。 -
id = input('请输入学号(如1001):')
: 提示用户输入学号,并将输入的值赋给变量id
。 -
if not id:
: 如果学号为空(用户没有输入),则执行break
语句退出循环,即结束录入信息操作。 -
name = input('请输入姓名:')
: 提示用户输入姓名,并将输入的值赋给变量name
。 -
if not name:
: 如果姓名为空(用户没有输入),则执行break
语句退出循环,即结束录入信息操作。 -
try:
: 使用try
语句开始尝试录入成绩信息,因为成绩有可能录入错误,所以使用异常处理。 -
english = int(input('请输入英语成绩:'))
: 提示用户输入英语成绩,并将输入的字符串转换为整数类型,并将其赋给变量english
。 -
python = int(input('请输入python成绩:'))
: 提示用户输入Python成绩,并将输入的字符串转换为整数类型,并将其赋给变量python
。 -
java = int(input('请输入Java成绩:'))
: 提示用户输入Java成绩,并将输入的字符串转换为整数类型,并将其赋给变量java
。 -
except:
: 如果输入的成绩无效(无法转换为整数),则执行except
语句块,打印错误提示信息并继续循环。 -
student = {'id':id,'name':name,'english':english,'python':python,'java':java}
: 将录入的学生信息保存到一个字典student
中,包括学号、姓名、英语成绩、Python成绩和Java成绩。 -
student_list.append(student)
: 将学生信息字典student
添加到列表student_list
中。 -
anewer = input('是否继续添加?y/n\n')
: 提示用户是否继续添加学生信息,用户输入y
表示继续,输入其他任意值表示退出。 -
if anewer=='y': continue else: break
: 根据用户输入的选择,如果是y
则继续循环,否则执行break
语句退出循环。 -
最后,如果退出循环,即用户不再添加学生信息,则调用一个未定义的
save()
函数来保存学生信息到文件中(你需要自行定义该函数),并输出"学生信息录入完毕!!!"的提示信息。
def insert(): # 定义insert()函数,录入学生信息student_list = [] # 创建一个列表,用于存储录入的学生信息while True: # 循环录入学生信息id = input('请输入学号(如1001):')if not id: # 如果没有输入学号或者输入错误,则执行break,退出录入信息操作breakname = input('请输入姓名:')if not name: # 如果是空的,则执行breakbreak# 然后开始录入成绩信息,但是成绩有可能录入错误,因此用try...except...保证异常处理try:english = int(input('请输入英语成绩:'))python = int(input('请输入python成绩:'))java = int(input('请输入Java成绩:'))except: #当你输入的成绩无效时,会执行except语句print('输入无效,不是整数类型,请重新输入')continue# 将录入的学生信息保存到字典student = {'id':id,'name':name,'english':english,'python':python,'java':java}# 将学生信息添加到列表中student_list.append(student)anewer = input('是否继续添加?y/n\n')if anewer=='y':continueelse:break2# 信息添加之后,将信息保存到文件中,需要退出循环# 调用save()函数,保存信息save(student_list) # save()函数未定义,需要自行定义print('学生信息录入完毕!!!')
04-查找学生信息功能实现
2,表示查找学生信息,调用search()函数,函数如下
代码解释如下:这段代码定义了一个名为search()
的函数,其作用是用于查找学生信息。
-
def search():
: 这是定义一个函数的开始,函数名为search
。 -
student_query = []
: 创建一个空列表student_query
,用于存储查询到的学生信息。 -
while True:
: 进入一个无限循环,直到用户选择退出查询操作。 -
id = ''
和name = ''
: 初始化两个变量id
和name
为空字符串,用于存储用户输入的学号和姓名。 -
if os.path.exists(filename):
: 检查是否存在指定的文件(未提供filename
变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。 -
mode = input('按学号查找请输入1,按姓名查找请输入2')
: 提示用户选择查询方式,1表示按学号查询,2表示按姓名查询。 -
if mode == '1':
: 如果用户选择按学号查询,则要求用户输入要查找学生的学号。 -
elif mode=='2':
: 如果用户选择按姓名查询,则要求用户输入要查找学生的姓名。 -
else:
: 如果用户输入有误(既不是1也不是2),则输出错误提示信息并重新调用search()
函数以重新执行查询操作。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 打开指定的文件进行读取操作,使用with
语句可以确保文件在使用后被正确关闭。 -
student = rfile.readlines()
: 读取文件中的所有内容,并将每行内容存储在列表student
中。 -
for item in student:
: 遍历student
列表中的每一行内容。 -
d =dict(eval(item))
: 将每行内容转换为字典类型,并赋给变量d
,这里使用eval()
函数将字符串转换为字典类型。 -
if id != '':
和if name != '':
: 如果用户输入了学号或姓名(即不为空),则执行相应的查询操作。 -
student_query.append(d)
: 将符合查询条件的学生信息字典添加到student_query
列表中。 -
show_student(student_query)
: 调用一个未定义的show_student()
函数来显示查询结果,你需要自行定义该函数。 -
student_query.clear()
: 清空student_query
列表,以便下一次查询使用。 -
answer = input('是否继续执行查询操作?y/n\n')
: 提示用户是否继续执行查询操作,如果用户输入y
则继续,否则执行break
语句退出循环。 -
else:
: 如果指定的文件不存在,则输出提示信息"未录入学生信息"并返回,即结束函数的执行。
def search(): # 定义search()函数,查找学生信息student_query = []while True:id = ''name = ''if os.path.exists(filename):# 现在分模式查找,1代表使用id查找,2代表使用name查找mode = input('按学号查找请输入1,按姓名查找请输入2')if mode == '1': # 需要加上单引号,因为输入的是字符串,并未转变类型id = input('请输入要查找学生的id:')elif mode=='2': # elif就相当于else if的功能,主要在有多个选择时使用,因为if先用来判断是否为1# 下面还有两个选择,就是2和其他的数,因此不能直接用else,还要用elif判断一下是否为2name = input('请输入要查找学生的姓名:')else:print('您的输入有误,请重新输入')search() #输入错了,就重新调用函数,也可以使用continuewith open(filename,'r',encoding='UTF-8') as rfile: # 读取内容,将所有内容放在student文件中student = rfile.readlines()for item in student: # 遍历student列表d =dict(eval(item)) # 字符串转成字典类型if id != '':if d['id'] ==id:student_query.append(d)if name != '':if d['name'] == name:student_query.append(d)# 显示查询结果show_student(student_query) # 定义show_student函数# 清空列表student_query.clear()answer = input('是否继续执行查询操作?y/n\n')if answer=='y':continueelse:breakelse:print('未录入学生信息')return
05-删除学生信息功能实现
3,表示删除学生信息,调用delete()函数,函数如下
代码解释如下,这段代码定义了一个名为delete()
的函数,其作用是用于删除学生信息。:
-
def delete():
: 这是定义一个函数的开始,函数名为delete
。 -
while True:
: 进入一个无限循环,直到用户选择退出删除操作。 -
student_id = input('请输入要删除的学生的id:')
: 提示用户输入要删除的学生的学号。 -
if student_id!='':
: 检查用户输入的学号是否不为空。 -
if os.path.exists(filename):
: 检查是否存在指定的文件(同样未提供filename
变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as file:
: 使用with
语句打开文件进行读取操作。 -
student_old = file.readlines()
: 将文件中的所有内容读取到列表student_old
中。 -
flag = False
: 初始化一个标记变量flag
,用于标记是否删除了学生信息。 -
if student_old:
: 如果student_old
列表不为空(即文件中存在学生信息),则执行下面的操作。 -
with open(filename,'w',encoding='UTF-8') as wfile:
: 使用with
语句打开文件进行写入操作,这里打开方式为覆盖写入('w’模式)。 -
for item in student_old:
: 遍历student_old
列表中的每个学生信息。 -
d =dict(eval(item))
: 将每行内容(学生信息)转换为字典类型,并赋给变量d
,这里使用eval()
函数将字符串转换为字典类型。 -
if d['id']!= student_id:
: 检查当前学生信息的学号是否与用户输入的学号不相等,如果不相等则写入到新文件中(相当于删除了这条学生信息)。 -
else:
: 如果当前学生信息的学号与用户输入的学号相等,则将标记变量flag
设为True
,表示找到了要删除的学生信息。 -
if flag==1:
: 如果flag
为True
(1),则输出删除成功的提示信息。 -
else:
: 如果flag
为False
,则输出未找到要删除的学生信息的提示信息。 -
show()
: 调用一个未定义的show()
函数来重新显示全部学生信息,你需要自行定义该函数。 -
answer = input('是否继续删除学生信息?y/n\n')
: 提示用户是否继续执行删除操作,如果用户输入y
则继续,否则执行break
语句退出循环。
def delete(): # 定义delete()函数,删除学生信息while True:student_id = input('请输入要删除的学生的id:')if student_id!='':# 当输入的id之后,则不是空的,此时要判断导入id是否在文件中,使用os模块if os.path.exists(filename): # 判断文件是否存在with open(filename,'r',encoding='UTF-8') as file:student_old = file.readlines() # 如果存在,读取学生的信息,将其添加到列表当中else: # 如果不存在student_old=[] # 建立一个空列表flag = False # 标记是否删除if student_old: # 这里表示如果列表student_old为真,则执行下面with语句with open(filename,'w',encoding='UTF-8') as wfile: # 使用上下管理器,写入d ={} # 创建一个空字典for item in student_old: # 遍历student_old中的信息d=dict(eval(item)) # 将字符串转成字典if d['id']!= student_id: # 判断是否与输入的信息相等wfile.write(str(d)+'\n') # 不相等,则写入d字典中else:flag = True # 相等则执行删除操作if flag==1:print(f'id为{student_id}的学生信息已被删除')else:print(f'没有找到id为{student_id}的学生信息')else: # 文件不存在print('无学生信息')breakshow() # 删除之后重新显示全部学生信息answer = input('是否继续删除学生信息?y/n\n')if answer == 'y':continueelse:break
06-修改学生信息功能实现
4,表示修改学生信息,调用modify()函数,函数如下
代码解释如下,这段代码定义了一个名为 modify()
的函数,其作用是用于修改学生信息。
-
def modify():
: 这是定义一个函数的开始,函数名为modify
。 -
show()
: 调用一个未定义的show()
函数来显示全部学生信息,你需要自行定义该函数。 -
if os.path.exists(filename):
: 检查是否存在指定的文件(同样未提供filename
变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 使用with
语句打开文件进行读取操作。 -
student_old = rfile.readlines()
: 将文件中的所有内容读取到列表student_old
中,每行内容作为列表的一个元素。 -
student_id = input('请输入需要修改学生的id:')
: 提示用户输入需要修改的学生的学号。 -
if student_id != '':
: 检查用户输入的学号是否不为空。 -
with open(filename,'w',encoding='UTF-8') as wfile:
: 使用with
语句打开文件进行写入操作,这里打开方式为覆盖写入(‘w’ 模式)。 -
for item in student_old:
: 遍历student_old
列表中的每个学生信息。 -
d = dict(eval(item))
: 将每行内容(学生信息)转换为字典类型,并赋给变量d
,这里使用eval()
函数将字符串转换为字典类型。 -
if d['id'] == student_id:
: 检查当前学生信息的学号是否与用户输入的学号相等,如果相等则表示找到了要修改的学生信息。 -
while True:
: 进入一个无限循环,直到用户输入正确的信息。 -
try:
: 尝试执行下面的代码块。 -
d['name'] = input('请输入名字:')
: 提示用户输入新的名字,并更新到学生信息中。 -
d['english'] = input('请输入英语成绩:')
: 提示用户输入新的英语成绩,并更新到学生信息中。 -
d['python'] = input('请输入python成绩:')
: 提示用户输入新的Python成绩,并更新到学生信息中。 -
d['java'] = input('请输入java成绩:')
: 提示用户输入新的Java成绩,并更新到学生信息中。 -
except:
: 如果用户输入有误,则执行下面的代码块。 -
break
: 如果用户输入正确,跳出无限循环。 -
wfile.write(str(d)+'\n')
: 将更新后的学生信息写入到文件中。 -
answer = input('是否继续修改其他学生的信息?y/n\n')
: 提示用户是否继续执行修改操作,如果用户输入y
则继续,否则结束函数。 -
if answer=='y': modify()
: 如果用户选择继续修改其他学生信息,则递归调用modify()
函数。
def modify(): # 定义modify()函数,修改学生信息show()if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:student_old = rfile.readlines() # readlines() 函数用于读取文件中的所有行,然后将起放入创建的列表中else:return # 文件不存在,结束函数student_id = input('请输入需要修改学生的id:')if student_id != '':if os.path.exists(filename):with open(filename,'w',encoding='UTF-8') as wfile:for item in student_old:d = dict(eval(item))if d['id'] == student_id:print('找到学生相关信息,可以修改他的相关信息了!!!')while True:try:d['name'] = input('请输入名字:')d['english'] = input('请输入英语成绩:')d['python'] = input('请输入python成绩:')d['java'] = input('请输入java成绩')except:print('输入有误,请重新输入') # 如果输入有误,则会继续执行while trueelse:break# 如果都没输入错误,则使用write写入wfile.write(str(d)+'\n')print('修改成功')# 一些学生被修改,还有一些未修改的学生,也就是id不相等的else:wfile.write(str(d)+'\n')answer = input('是否继续修改其他学生的信息?y/n\n')if answer=='y':modify() # 在函数里面调用函数
07-对学生成绩进行排序功能实现
5,表示对学生成绩进行排序,调用sort()函数,函数如下
代码解释如下,这段代码定义了一个名为 sort()
的函数,其作用是对学生成绩进行排序。
-
def sort():
: 这是定义一个函数的开始,函数名为sort
。 -
show()
: 调用一个未定义的show()
函数来显示全部学生信息,你需要自行定义该函数。 -
if os.path.exists(filename):
: 检查是否存在指定的文件(同样未提供filename
变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 使用with
语句打开文件进行读取操作。 -
student_list = rfile.readlines()
: 将文件中的所有内容读取到列表student_list
中,每行内容作为列表的一个元素。 -
student_new = []
: 创建一个空列表student_new
,用于存储将每行学生信息转换为字典后的结果。 -
for item in student_list:
: 遍历student_list
列表中的每个学生信息。 -
d = dict(eval(item))
: 将每行内容(学生信息)转换为字典类型,并赋给变量d
,这里使用eval()
函数将字符串转换为字典类型。 -
student_new.append(d)
: 将转换后的学生信息字典添加到student_new
列表中。 -
asc_or_desc = input('请选择(0.升序 1.降序)')
: 提示用户选择排序方式,0 表示升序,1 表示降序。 -
if asc_or_desc=='0': asc_or_desc_bool = False
: 如果用户选择升序,则将asc_or_desc_bool
设为False
,否则设为True
表示降序。 -
mode = input('请选择排序方式(1.英语成绩排序 2.python成绩排序 3.java成绩排序 0.总成绩排序)')
: 提示用户选择排序方式,1 表示按英语成绩排序,2 表示按Python成绩排序,3 表示按Java成绩排序,0 表示按总成绩排序。 -
根据用户输入的
mode
,使用lambda
函数定义排序的关键字,然后使用sort()
函数对student_new
列表进行排序。 -
show_student(student_new)
: 调用一个未定义的show_student()
函数来显示排序后的学生信息,你需要自行定义该函数。
def sort(): # 定义sort()函数,对学生成绩进行排序show()if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:student_list = rfile.readlines()student_new = []for item in student_list:d = dict(eval(item))student_new.append(d)else:return# 共有升序和降序两种排序方式,手动输入asc_or_desc = input('请选择(0.升序 1.降序)')if asc_or_desc=='0':asc_or_desc_bool = Falseelif asc_or_desc=='1':asc_or_desc_bool = Trueelse:print('您的输入有误,请重新输入')sort()mode = input('请选择排序方式(1.英语成绩排序 2.python成绩排序 3.java成绩排序 0.总成绩排序)')if mode=='1':student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)elif mode =='2':student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)elif mode =='3':student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)elif mode =='0':student_new.sort(key=lambda x:int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)else:print('您的输入有误,请重新输入')sort()show_student(student_new)
08-统计学生总人数功能实现
6,表示统计学生总人数,调用total()函数,函数如下
代码解释如下,这段代码定义了一个名为 total()
的函数,其作用是统计学生总人数。
-
def total():
: 这是定义一个函数的开始,函数名为total
。 -
if os.path.exists(filename):
: 检查是否存在指定的文件(同样未提供filename
变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 使用with
语句打开文件进行读取操作。 -
students = rfile.readlines()
: 将文件中的所有内容读取到列表students
中,每行内容作为列表的一个元素。 -
if students:
: 检查students
列表是否非空,即是否有学生信息。 -
print(fr'一共有{len(students)}名学生')
: 如果有学生信息,则使用len()
函数统计学生总人数,并打印出来。 -
else:
: 如果students
列表为空,即没有学生信息,则打印提示信息'尚未录入学生信息'
。
def total(): # 定义total()函数,统计学生总人数if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:students = rfile.readlines()if students:print(fr'一共有{len(students)}名学生')else:print('尚未录入学生信息')
09-显示所有学生信息功能实现
7,表示显示所有学生的信息,调用show()函数,函数如下
代码解释如下,这段代码定义了一个名为 show()
的函数,其作用是显示所有学生的信息。
-
def show():
: 这是定义一个函数的开始,函数名为show
。 -
student_lst = []
: 创建一个空列表student_lst
,用于存储所有学生的信息。 -
if os.path.exists(filename):
: 检查是否存在指定的文件(同样未提供filename
变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。 -
with open(filename,'r',encoding='UTF-8') as rfile:
: 使用with
语句打开文件进行读取操作。 -
students = rfile.readlines()
: 将文件中的所有内容读取到列表students
中,每行内容作为列表的一个元素。 -
for item in students:
: 遍历students
列表中的每个学生信息。 -
student_lst.append(eval(item))
: 将每行内容(学生信息)转换为字典类型,并添加到student_lst
列表中。这里使用eval()
函数将字符串转换为字典类型。 -
if student_lst:
: 检查student_lst
列表是否非空,即是否有学生信息。 -
如果
student_lst
列表非空,则调用一个未定义的show_student()
函数来显示所有学生的信息,你需要自行定义该函数。 -
如果文件不存在或者没有学生信息,则打印提示信息
'尚未录入学生信息!!!'
。
def show(): # 定义show()函数,显示所有学生的信息student_lst = []if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:students = rfile.readlines()for item in students:student_lst.append(eval(item))if student_lst:show_student(student_lst)else:print('尚未录入学生信息!!!')
总结
01-整体代码实现
注:上面仅仅是每一项功能实现的代码,整体代码如下,如果需要使用,一定要使用下面的代码。
import os
filename = 'students.txt'
def main():while True: # 为了显示主菜单menu() # 调用menu()函数# 有各种功能,下面就是让用户选择choice = int(input('请选择'))if choice in [0,1,2,3,4,5,6,7]: # 共有八个功能,判断选择的是否在这八个序号里面if choice==0: # 选择0,表示退出系统answer = input('您确定要退出系统吗?y/n\n') # 输出一个询问,是否要退出if answer=='y' or answer=='Y': # 判断输入的是否为yprint('谢谢您的使用')break # 打断menu()函数的输出else: # 不是选的ycontinue # 继续程序执行elif choice==1: # 如果选择的是1insert() # 调用insert()函数,录入学生信息elif choice==2: # 如果选择的是2search() # 调用search()函数,查找学生信息elif choice==3: # 如果选择的是3delete() # 调用delete()函数,删除学生信息elif choice==4: # 如果选择的是4modify() # 调用modify()函数,修改学生信息elif choice==5: # 如果选择的是5sort() # 调用sort()函数,对学生成绩进行排序elif choice==6: # 如果选择的是6total() # 调用total()函数,统计学生总人数elif choice==7: # 如果选择的是7show() # 调用show()函数,显示所有学生的信息def menu():print('======================学生信息管理系统======================')print('-------------------------功能菜单-------------------------')print('\t\t\t\t\t\t1.录入学生信息')print('\t\t\t\t\t\t2.查找学生信息')print('\t\t\t\t\t\t3.删除学生信息')print('\t\t\t\t\t\t4.修改学生信息')print('\t\t\t\t\t\t5.排序')print('\t\t\t\t\t\t6.统计学生总人数')print('\t\t\t\t\t\t7.显示所有学生信息')print('\t\t\t\t\t\t0.退出系统')print('---------------------------------------------------------')def insert(): # 定义insert()函数,录入学生信息student_list = [] # 创建一个列表,用于存储录入的学生信息while True: # 循环录入学生信息id = input('请输入学号(如1001):')if not id: # 如果没有输入学号或者输入错误,则执行break,退出录入信息操作breakname = input('请输入姓名:')if not name: # 如果是空的,则执行breakbreak# 然后开始录入成绩信息,但是成绩有可能录入错误,因此用try...except...保证异常处理try:english = int(input('请输入英语成绩:'))python = int(input('请输入python成绩:'))java = int(input('请输入Java成绩:'))except: #当你输入的成绩无效时,会执行except语句print('输入无效,不是整数类型,请重新输入')continue# 将录入的学生信息保存到字典student = {'id':id,'name':name,'english':english,'python':python,'java':java}# 将学生信息添加到列表中student_list.append(student)anewer = input('是否继续添加?y/n\n')if anewer=='y':continueelse:break2# 信息添加之后,将信息保存到文件中,需要退出循环# 调用save()函数,保存信息save(student_list) # save()函数未定义,需要自行定义print('学生信息录入完毕!!!')
def save(lst): # 传进去一个列表# 然后将列表中的内容保存在文件中try:stu_txt = open(filename,'a',encoding='UTF-8')except:stu_txt = open(filename,'w',encoding='UTF-8')for item in lst:stu_txt.write(str(item)+'\n')stu_txt.close()def search(): # 定义search()函数,查找学生信息student_query = []while True:id = ''name = ''if os.path.exists(filename):# 现在分模式查找,1代表使用id查找,2代表使用name查找mode = input('按学号查找请输入1,按姓名查找请输入2')if mode == '1': # 需要加上单引号,因为输入的是字符串,并未转变类型id = input('请输入要查找学生的id:')elif mode=='2': # elif就相当于else if的功能,主要在有多个选择时使用,因为if先用来判断是否为1# 下面还有两个选择,就是2和其他的数,因此不能直接用else,还要用elif判断一下是否为2name = input('请输入要查找学生的姓名:')else:print('您的输入有误,请重新输入')search() #输入错了,就重新调用函数,也可以使用continuewith open(filename,'r',encoding='UTF-8') as rfile: # 读取内容,将所有内容放在student文件中student = rfile.readlines()for item in student: # 遍历student列表d =dict(eval(item)) # 字符串转成字典类型if id != '':if d['id'] ==id:student_query.append(d)if name != '':if d['name'] == name:student_query.append(d)# 显示查询结果show_student(student_query) # 定义show_student函数# 清空列表student_query.clear()answer = input('是否继续执行查询操作?y/n\n')if answer=='y':continueelse:breakelse:print('未录入学生信息')return
def show_student(lst):# 显示查询结果的过程,结果是按照一定的格式显示的,因此要使用格式化字符串if len(lst) ==0:print('没有查询到学生信息,无数据显示!!!')return# 如果查到了,就要定义标题的显示格式format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'print(format_title.format('id','姓名','英语成绩','python成绩','java成绩','总成绩'))# 定义内容的显示格式format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'for item in lst:print(format_data.format(item.get('id'),item.get('name'),item.get('english'),item.get('python'),item.get('java'),int(item.get('english'))+int(item.get('python'))+int(item.get('java'))))
def delete(): # 定义delete()函数,删除学生信息while True:student_id = input('请输入要删除的学生的id:')if student_id!='':# 当输入的id之后,则不是空的,此时要判断导入id是否在文件中,使用os模块if os.path.exists(filename): # 判断文件是否存在with open(filename,'r',encoding='UTF-8') as file:student_old = file.readlines() # 如果存在,读取学生的信息,将其添加到列表当中else: # 如果不存在student_old=[] # 建立一个空列表flag = False # 标记是否删除if student_old: # 这里表示如果列表student_old为真,则执行下面with语句with open(filename,'w',encoding='UTF-8') as wfile: # 使用上下管理器,写入d ={} # 创建一个空字典for item in student_old: # 遍历student_old中的信息d=dict(eval(item)) # 将字符串转成字典if d['id']!= student_id: # 判断是否与输入的信息相等wfile.write(str(d)+'\n') # 不相等,则写入d字典中else:flag = True # 相等则执行删除操作if flag==1:print(f'id为{student_id}的学生信息已被删除')else:print(f'没有找到id为{student_id}的学生信息')else: # 文件不存在print('无学生信息')breakshow() # 删除之后重新显示全部学生信息answer = input('是否继续删除学生信息?y/n\n')if answer == 'y':continueelse:break
def modify(): # 定义modify()函数,修改学生信息show()if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:student_old = rfile.readlines() # readlines() 函数用于读取文件中的所有行,然后将起放入创建的列表中else:return # 文件不存在,结束函数student_id = input('请输入需要修改学生的id:')if student_id != '':if os.path.exists(filename):with open(filename,'w',encoding='UTF-8') as wfile:for item in student_old:d = dict(eval(item))if d['id'] == student_id:print('找到学生相关信息,可以修改他的相关信息了!!!')while True:try:d['name'] = input('请输入名字:')d['english'] = input('请输入英语成绩:')d['python'] = input('请输入python成绩:')d['java'] = input('请输入java成绩')except:print('输入有误,请重新输入') # 如果输入有误,则会继续执行while trueelse:break# 如果都没输入错误,则使用write写入wfile.write(str(d)+'\n')print('修改成功')# 一些学生被修改,还有一些未修改的学生,也就是id不相等的else:wfile.write(str(d)+'\n')answer = input('是否继续修改其他学生的信息?y/n\n')if answer=='y':modify() # 在函数里面调用函数def sort(): # 定义sort()函数,对学生成绩进行排序show()if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:student_list = rfile.readlines()student_new = []for item in student_list:d = dict(eval(item))student_new.append(d)else:return# 共有升序和降序两种排序方式,手动输入asc_or_desc = input('请选择(0.升序 1.降序)')if asc_or_desc=='0':asc_or_desc_bool = Falseelif asc_or_desc=='1':asc_or_desc_bool = Trueelse:print('您的输入有误,请重新输入')sort()mode = input('请选择排序方式(1.英语成绩排序 2.python成绩排序 3.java成绩排序 0.总成绩排序)')if mode=='1':student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)elif mode =='2':student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)elif mode =='3':student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)elif mode =='0':student_new.sort(key=lambda x:int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)else:print('您的输入有误,请重新输入')sort()show_student(student_new)
def total(): # 定义total()函数,统计学生总人数if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:students = rfile.readlines()if students:print(fr'一共有{len(students)}名学生')else:print('尚未录入学生信息')
def show(): # 定义show()函数,显示所有学生的信息student_lst = []if os.path.exists(filename):with open(filename,'r',encoding='UTF-8') as rfile:students = rfile.readlines()for item in students:student_lst.append(eval(item))if student_lst:show_student(student_lst)else:print('尚未录入学生信息!!!')
if __name__ == '__main__':main()
相关文章:

【Python编程实战】基于Python语言实现学生信息管理系统
🎩 欢迎来到技术探索的奇幻世界👨💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…...

AI网络爬虫:批量爬取电视猫上面的《庆余年》分集剧情
电视猫上面有《庆余年》分集剧情,如何批量爬取下来呢? 先找到每集的链接地址,都在这个class"epipage clear"的div标签里面的li标签下面的a标签里面: <a href"/drama/Yy0wHDA/episode">1</a> 这个…...

md5强弱碰撞
一,类型。 1.弱比较 php中的""和""在进行比较时,数字和字符串比较或者涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。按照此理,我们可以上传md5编码后是0e的字符串,在…...

【Docker故障处理篇】运行容器报错“docker: failed to register layer...file exists.”解决方法
【Docker故障处理篇】运行容器报错“docker: failed to register layer...file exists.” 一、Docker环境介绍2.1 本次环境介绍2.2 本次实践介绍二、故障现象2.1 运行容器消失2.2 重新运行容器报错三、故障分析四、故障处理4.1 停止 Docker 服务:4.2 备份重要数据4.3 清理冲突…...

小红书-社区搜索部 (NLP、CV算法实习生) 一面面经
😄 整个流程按如下问题展开,用时60min左右面试官人挺好,前半部分问问题,后半部分coding一道题。 各位有什么问题可以直接评论区留言,24小时内必回信息,放心~ 文章目录 1、自我介绍2、介绍下项目:微信-多模态小视频分类2.1、看你用了cross-att来融合多模态信息,cross…...

解读makefile中的.PHONY
在 Makefile 中,.PHONY 是一个特殊的目标,用于声明伪目标(phony target)。伪目标是指并不代表实际构建结果的目标,而是用来触发特定动作或命令的标识。通常情况下,.PHONY 会被用来声明一组需要执行的动作&a…...

linux配置防火墙端口
配置防火墙,添加或删除端口,需要有root权限。 防火墙常用命令如下: 1.查看防火墙状态: systemctl status firewalld active(running):开启状态,正在运行中 inactive(dead):关闭状态ÿ…...

sklearn线性回归--岭回归
sklearn线性回归--岭回归 岭回归也是一种用于回归的线性模型,因此它的预测公式与普通最小二乘法相同。但在岭回归中,对系数(w)的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加约束,使系数尽量小…...

三十一、openlayers官网示例Draw Features解析——在地图上自定义绘制点、线、多边形、圆形并获取图形数据
官网demo地址: Draw Features 先初始化地图,准备一个空的矢量图层,用于显示绘制的图形。 initLayers() {const raster new TileLayer({source: new XYZ({url: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/…...

医疗科技:UWB模块为智能医疗设备带来的变革
随着医疗科技的不断发展和人们健康意识的提高,智能医疗设备的应用越来越广泛。超宽带(UWB)技术作为一种新兴的定位技术,正在引领着智能医疗设备的变革。UWB模块作为UWB技术的核心组成部分,在智能医疗设备中发挥着越来越…...

Java面试题大全(从基础到框架,中间件,持续更新~~~)
从Java基础到数据库,Spring,MyBatis,消息中间件,微服务解决全部Java面试过程中的问题。(持续更新~~) Java基础 2024最新Java面试题——java基础 MySQL基础 mysql基础知识——适合不太熟悉数据库知识的小…...

零知识证明在隐私保护和身份验证中的应用
PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 隐私保护和身份验证是现代社会中的关键问题,尤其是在数字化时代。零知识证明(Zero-Knowledge Proofs&…...

15.微信小程序之async-validator 基本使用
async-validator是一个基于 JavaScript 的表单验证库,支持异步验证规则和自定义验证规则 主流的 UI 组件库 Ant-design 和 Element中的表单验证都是基于 async-validator 使用 async-validator 可以方便地构建表单验证逻辑,使得错误提示信息更加友好和…...

元宇宙vr科普馆场景制作引领行业潮流
在这个数字化高速发展的时代,北京3D元宇宙场景在线制作以其独特的优势,成为了行业内的创新引领者。它能够快速完成空间设计,根据您的个性化需求,轻松设置布局、灯光、音效以及互动元素等,为您打造出一个更加真实、丰富…...

kotlin基础之高阶函数
Kotlin中的高阶函数、内联函数以及noinline和crossinline关键字是函数式编程中的重要概念。下面我将逐一解释这些概念的定义、实现原理、使用场景以及noinline和crossinline关键字的具体用法。 高阶函数 定义:高阶函数是接受一个或多个函数作为参数,或…...

【Python音视频技术】用moviepy实现图文成片功能
今天上班的时候看到有人群里问 图文成片怎么实现。 临时给我提供一点写作的灵感,趁着下班写一篇。这里用到 python的moviepy库, 之前文章介绍过。 大体思路:假定有4张图片,每张图片将在视频中展示2秒钟,并且图片会按照…...

【Linux】权限的理解之权限掩码(umask)
目录 前言 一、利用八进制数值表示文件或目录的权限属性 二、系统默认的权限掩码和权限掩码的作用原理 三、分析权限掩码改变文件或目录的权限属性 前言 权限掩码是由4个数字组合而成的,默认的第一位数字是0;后三位数字分别由八进制位数字组成。权限…...

UVa1466/LA4849 String Phone
UVa1466/LA4849 String Phone 题目链接题意分析AC 代码 题目链接 本题是2010年icpc亚洲区域赛大田赛区的G题 题意 平面网格上有n(n≤3000)个单元格,各代表一个重要的建筑物。为了保证建筑物的安全,警察署给每个建筑物派了一名警察…...

使用Word表格数据快速创建图表
实例需求:Word的表格如下所示,标题行有合并单元格。 现在需要根据上述表格数据,在Word中创建如下柱图。如果数据在Excel之中,那么创建这个图并不复杂,但是Word中就没用那么简单了,虽然Word中可以插入图表&a…...

JAVA面试题大全(十三)
1、Mybatis 中 #{}和 ${}的区别是什么? 在 MyBatis 中,#{} 和 ${} 是两种用于参数绑定的方式,它们之间的主要区别在于数据处理的方式和 SQL 注入的风险。 #{}:预编译处理 #{} 用于预编译处理,MyBatis 会为其生成 Prep…...

搜维尔科技:第九届元宇宙数字人设计大赛入围作品名单
随着第九届元宇宙数字人设计大赛渐近尾声,各院校提交的数字人作品已陆续完成评分统计汇总工作!现将入围名单公布,请入围团队尽可能到场参加大赛颁奖典礼,具体获奖名次将在颁奖典礼中现场公布! 颁奖典礼时间、地点&…...

SMB工具横向移动
一. SMB工具介绍和使用 1.介绍 2013年的Defcon上,就引入了smbexec,后续 smbexec 被 Impacket 进一步完善了。在Impacket中支持明文认证,NTLM认证,Aeskey认证等方式! 2. 使用方法 命令: smbexec.exe 用户…...

cesuim
new Cesium.Color(255,255,0,1), //颜色 Math.PI/2color: Cesium.Color.fromCssColorString("#f40"), //16进制颜色初始化地球 import * as Cesium from "cesium";import { onMounted } from "vue"; onMounted(() > {Cesium.Ion.defaultAcc…...

2023、2024国赛web复现wp
2023 Unzip 类型:任意文件上传漏洞 主要知识点:软链接 随便上传一个一句话木马文件,得到一串php代码 根据代码上传zip文件发现进入后还是此页面 代码审计: <?php error_reporting(0); highlight_file(__FILE__);$finfo fin…...

day34 贪心算法 455.分发饼干 376. 摆动序列
贪心算法理论基础 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心一般解题步骤(贪心无套路): 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 455.分发饼干 …...

养老院管理系统基于springboot的养老院管理系统java项目
文章目录 养老院管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 养老院管理系统 一、项目演示 养老院管理系统 二、项目介绍 基于springboot的养老院管理系统 角色:超级…...

跳台阶扩展问题
题目链接 f(1) 1f(2) 1 1 2f(3) 1 2 1 4f(4) 1 2 4 1 8 所以 f(n) 2 n − 1 ^{n-1} n−1 import java.util.Scanner;public class Solution {public int jumpFloorII(int target) {return 1 << (target - 1);} }...

超清高帧,成像升级 | SWIR短波红外相机500万像素992芯片
博图光电5MP短波红外相机,搭载了索尼IMX992 SenSWIR传感器,支持5.2MP分辨率,适合探测波长在400nm-1700nm波段的可见光和短波红外光,有效面积和透光率得到提升,内置TEC制冷片,实现了像素尺寸和图像均匀性方面…...

攻击渗透思考题
1. windows登录的明文密码,存储过程是怎么样的,密文存在哪个文件下,该文件是否可以打开,并且查看到密文 在Windows操作系统中,登录时输入的明文密码不会以明文形式存储在系统中。相反,Windows使用一种称为“…...

Flutter 中的 Opacity 小部件:全面指南
Flutter 中的 Opacity 小部件:全面指南 在Flutter中,动画和视觉效果是提升用户体验的重要手段。Opacity小部件允许你改变子组件的透明度,从而实现淡入、淡出或其它透明度相关的动画效果。本文将提供Opacity的全面指南,帮助你了解…...