主程序函数说明
分支代码解析
def Insert():
while True:
student_info = []
id = input('请输入学生ID【如 1001】')
if not id:
break
name = input('请输入学生姓名【如:张三】')
if not name:
break
try:
chinese = int(input('请输入语文成绩:'))
maths = int(input('请输入数学成绩:'))
english = int(input('请输入英语成绩:'))
physics = int(input('请输入物理成绩:'))
# 保存信息到字典中
student = {'id': id, 'name': name, 'chinese': chinese, 'maths': maths, 'english': english,'physics': physics}
# 信息保存到列表中
student_info.append(student)
# 调用保存函数,对数据进行保存
Save(student_info)
except:
print('输入无效,不是整数哦!请重新输入')
continue
answer = input('是否继续录入y/n\n')
if answer.lower() == 'y':
continue
else:
break
def Search():
student_query = []
while True:
id = ''
name = ''
if os.path.exists(filename):
mode = input('按ID查找请输入1,按姓名查找请输入2:')
if mode == '1':
id = input('请输入学生ID:')
elif mode == '2':
name = input('请输入学生姓名:')
else:
print('您的输入有误,请重新输入')
Search()
with open(filename, 'r', encoding='utf-8') as rfile:
student = rfile.readlines()
for item in student:
d = dict(eval(item))
if id != '':
if d['id'] == id: #比对输入的id和文件内的信息id,若相等则添加本条字典信息到空列表中
student_query.append(d)
if name != '':
if d['name'] == name:
student_query.append(d)
# 显示查询结果
show_student(student_query)
# 清空列表
student_query.clear()
answer = input('是否要继续查询?y/n :')
if answer.lower() == 'y':
continue
else:
break
def Delete():
while True:
#先输入需要删除的id,判断已经输入好,判断文件内部是否有这样的id
stu_id = input('请输入删除学生ID号:')
if id !='':
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as file:
stu_temp_old = file.readlines()
else:
stu_temp_old = []
flag = False #标记是否删除
if stu_temp_old:
#此入打开文件的状态为w,表示信息提取并写入覆盖的方式保存到本地硬盘中
with open(filename,'w',encoding='utf-8') as wfile:
d = {}
#建立一个空字典用来存储,通过readlines()导入到内存的数据
#由于item是把文本文件中的字典整条导入到列表中,因素我们需要把字典两边的字符去掉,实现字典还原
#导入到空字典中的还原字典的id和我们要删除的id如果不相等,则系统会重新把数据写入原文件中
#删除的方式,是把原数据提取出来,比较不同的id重新存入原文件,相同的信息不存入原文件,达到删除效果。
for item in stu_temp_old:
print('直接导入列表中的字典item',item)
d = dict(eval(item)) #字典还原
#?为什么要写wfile.write(......),不太理解
if d['id'] != stu_id:
wfile.write(str(d)+'\n') #如果提取信息不是要删除的信息,重新保存回本地硬盘内
else:
flag = True
if flag:
print(f'ID为{stu_id}的学生信息已删除')
else:
print(f'ID为{stu_id}的学生没有找到')
else:
print('无该学生信息')
break
Show()
answer = input('是否继续删除?y/n\n')
if answer.lower()=='y':
continue
else:
break
def Modify():
Show()
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as rfile:
student_old = rfile.readlines()
else:
return
student_id = input('请输入要修改的学员的ID:')
if student_id != '':
with open(filename, 'w', encoding='utf-8') as wfile:
for item in student_old:
d = dict(eval(item))
if d['id'] == student_id:
print('找到该学生信息,可以修改他的相关信息了!')
try:
d['id'] = input('请输入新的ID:')
d['name'] = input('请输入姓名:')
d['chinese'] = int(input('请输入语文的成绩:'))
d['maths'] = int(input('请输入数学的成绩:'))
d['english'] = int(input('请输入英语的成绩:'))
d['physics'] = int(input('请输入物理的成绩:'))
except:
print('您的输入有误,请重新输入!!!')
wfile.write(str(d) + '\n')
print('修改成功!')
else:
wfile.write(str(d) + '\n')
answer = input('是否继续修改其他学生的信息?y/n:')
if answer == 'y' or answer == 'Y':
Modify()
def Sort():
#定义一个全局变量,当Sort()函数结束时,保存变量的文字信息,供后面print()函数调用
#调用Show()函数,显示源文件中的所有学生信息
#利用os.path.exists()函数判断是否在本地硬盘存在源文件filename
#若本地存在文件则以只读方式打开文件,同时读取信息到内存,保存到列表student_list中
#建立一个空列表student_new,从内存的列表student_list遍历出每一带引号的字典项item
#然后利用eval()函数,把item两边的引号去掉,还原成字典格式,并存入变量d中
#然后利用append()函数把变量d中的字典数据添加到定义好的空列表student_new中
#如果源文件中不存在学生成绩信息,则执行print()函数后,return退出
#利用input函数,接收01字符,确定排序成绩的升降序方式,同时利用前面定义的全局变量asc_str接收字符
#利用asc_or_desc_bool变量,接收True和False来实现参数设置,以完成sort()函数的升降序设置
#然后对存入列表中的字典分别进行各科成绩进行排序,这里有2个知识点:sort()函数,lambda,现分别讲述
#sort()函数,对全部字典数据,按其参数key=接收字典中键名为指定名称某学科,存入lambda中的x内
# 利用int(x['chinese']),按照整数的形式进行成绩数据的排列,reverse=True/False进行升或降的排序
# 利用if elif函数,进行每个学科的单独设置排序
global asc_str
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:
print('文件中无学生信息')
return
asc_or_desc = input('请选择(0.升序 1.降序):')
if asc_or_desc == '0':
asc_str = '升'
asc_or_desc_bool = False
elif asc_or_desc == '1':
asc_str = '降'
asc_or_desc_bool = True
else:
Sort()
mode = int(input('请选择排序方式(1.按语文排序 2.按数学排序 3.按英语排序 4.按物理排序 0.按总成绩排序):'))
sub_num = ['总成绩','语文','数学','英语','物理']
print('++++',student_new)
if mode == 1:
student_new.sort(key=lambda x: int(x['chinese']), reverse=asc_or_desc_bool)
elif mode == 2:
student_new.sort(key=lambda x: int(x['maths']), reverse=asc_or_desc_bool)
elif mode == 3:
student_new.sort(key=lambda x: int(x['english']), reverse=asc_or_desc_bool)
elif mode == 4:
student_new.sort(key=lambda x: int(x['physics']), reverse=asc_or_desc_bool)
elif mode == 0:
student_new.sort(key=lambda x: int(x['chinese']) + int(x['maths']) + int(x['english']) + int(x['physics']),
reverse=asc_or_desc_bool)
else:
Sort()
show_student(student_new)
print(f'\n本次排序是---{sub_num[mode]}成绩---进行({asc_str}序)排序\n')
def Show():
#思路分析
# 定义一个空列表,判断文件内部是否含有数据,若有,就读取数据
#把读取数据保存到变量students列表中
#利用for in 对students列表中的字典进行提取,此处提取到的是带有字符属性的事引号的字典项item
#处理item,去除其两侧的引号,还原字典数据信息,并把信息保存到空列表stu_lst中
stu_lst = []
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8')as rfile:
students = rfile.readlines()
#print(students)
for item in students: #遍历列表中的字典'{...}'
stu_lst.append(eval(item)) # 去除字典两边引号{},添加到列表stu_lst列表中
if stu_lst:
show_student(stu_lst) #把处理好的列表信息文件,送入show_student()函数,显示
else:
print('暂未保存过数据!') #若硬盘的源文件中无数据,则显示print函数
def show_student(lst):
#判断接收到的lst(形参)---对应上在的stu_lst含有字典的列表
#使用Len()函数判断列表的长度是否为0,如果为零,输出print函数,并退出,如果不为零,则先定义一个格式:格式为居中,数字为总宽度,同时用分隔符分隔
#使用print()函数把定义好的格式,用format函数和显示列表的表头连起来,显示在python中
#for in 函数把列表中的字典依次从lst形参中取出来,同时利用字典中的item.get('键名')函数,取到对应的值value
#
if len(lst) == 0: #判断
print('没有查询到学生信息!!!')
return
#定义标题显示格式
format_title = '{:^6}\t{:^13}\t{:^10}\t{:^6}\t{:^10}\t{:^6}\t{:^7}' #定义显示表头格式
print(format_title.format('ID','姓名','语文成绩','数学成绩','英语成绩','物理成绩','总成绩')) #按格式输出表头
format_data = '{:^6}\t{:^13}\t{:^10}\t{:^18}\t{:^7}\t{:8}\t{:^17}' #定义数据格式
for item in lst:
print(
format_data.format(item.get('id'),item.get('name'),item.get('chinese'),
item.get('maths'),item.get('english'),item.get('physics'),
int(item.get('chinese')) + int(item.get('maths')) + int(item.get('english'))+ int(item.get('physics'))
)
) #按格式显示字典内各科成绩到python内部
8.主函数和运行函数代码段
def Main():
while True:
Menu_b()
choice = int(input('输入对应功能序号:'))
if choice in [0,1,2,3,4,5,6,7]:
if choice == 0:
answer = input('您确信退出系统?y/n')
if answer.lower() == 'y':
print('感谢使用本系统!')
break
else:
continue
elif choice == 1:
Insert()
elif choice == 2:
Search()
elif choice == 3:
Delete()
elif choice == 4:
Modify()
elif choice == 5:
Sort()
elif choice == 6:
Total()
elif choice == 7:
Show()
else:
print('请输入正确的信息编号:')
continue
if __name__=='__main__':
Main()
9.功能菜单代码段
def Menu_b():
print('''
===========学生信息管理系统========
-----------功 能 菜 单-----------
\n\t\t\t 1 录入学生信息 2 查找学生信息
\n\t\t\t 3 删除学生信息 4 修改学生信息
\n\t\t\t 5 学生信息排序 6 学生信息汇总
\n\t\t\t 7 学生信息展示 0 退出
___________________________________
''')
主程序完整代码段
import os
filename = 'student_score.txt'
def Menu_b():
print('''
===========学生信息管理系统========
-----------功 能 菜 单-----------
\n\t\t\t 1 录入学生信息 2 查找学生信息
\n\t\t\t 3 删除学生信息 4 修改学生信息
\n\t\t\t 5 学生信息排序 6 学生信息汇总
\n\t\t\t 7 学生信息展示 0 退出
___________________________________
''')
def Main():
while True:
Menu_b()
choice = int(input('输入对应功能序号:'))
if choice in [0,1,2,3,4,5,6,7]:
if choice == 0:
answer = input('您确信退出系统?y/n')
if answer.lower() == 'y':
print('感谢使用本系统!')
break
else:
continue
elif choice == 1:
Insert()
elif choice == 2:
Search()
elif choice == 3:
Delete()
elif choice == 4:
Modify()
elif choice == 5:
Sort()
elif choice == 6:
Total()
elif choice == 7:
Show()
else:
print('请输入正确的信息编号:')
continue
def Insert():
while True:
student_info = []
id = input('请输入学生ID【如 1001】')
if not id:
break
name = input('请输入学生姓名【如:张三】')
if not name:
break
try:
chinese = int(input('请输入语文成绩:'))
maths = int(input('请输入数学成绩:'))
english = int(input('请输入英语成绩:'))
physics = int(input('请输入物理成绩:'))
# 保存信息到字典中
student = {'id': id, 'name': name, 'chinese': chinese, 'maths': maths, 'english': english,'physics': physics}
# 信息保存到列表中
student_info.append(student)
# 调用保存函数,对数据进行保存
Save(student_info)
except:
print('输入无效,不是整数哦!请重新输入')
continue
answer = input('是否继续录入y/n\n')
if answer.lower() == 'y':
continue
else:
break
def Save(st):
#假如程序是第一次运行,就创建一个文件保存信息,假如已经创建了文件,第二次运行,直接打开文件写入信息
try:
student_txt = open(filename,'a',encoding='utf-8')
except:
student_txt = open(filename,'w',encoding='utf-8')
#把python中的信息变量写操作,内容为接收的列表中的字典项(st-此处是一个函数中的形参命名,对应student实际参数)
for info in st:
student_txt.write(str(info)+'\n')
student_txt.close()
pass #查找信息
def Delete():
while True:
#先输入需要删除的id,判断已经输入好,判断文件内部是否有这样的id
stu_id = input('请输入删除学生ID号:')
if id !='':
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as file:
stu_temp_old = file.readlines()
else:
stu_temp_old = []
flag = False #标记是否删除
if stu_temp_old:
#此入打开文件的状态为w,表示信息提取并写入覆盖的方式保存到本地硬盘中
with open(filename,'w',encoding='utf-8') as wfile:
d = {}
#建立一个空字典用来存储,通过readlines()导入到内存的数据
#由于item是把文本文件中的字典整条导入到列表中,因素我们需要把字典两边的字符去掉,实现字典还原
#导入到空字典中的还原字典的id和我们要删除的id如果不相等,则系统会重新把数据写入原文件中
#删除的方式,是把原数据提取出来,比较不同的id重新存入原文件,相同的信息不存入原文件,达到删除效果。
for item in stu_temp_old:
print('直接导入列表中的字典item',item)
d = dict(eval(item)) #字典还原
#?为什么要写wfile.write(......),不太理解
if d['id'] != stu_id:
wfile.write(str(d)+'\n') #如果提取信息不是要删除的信息,重新保存回本地硬盘内
else:
flag = True
if flag:
print(f'ID为{stu_id}的学生信息已删除')
else:
print(f'ID为{stu_id}的学生没有找到')
else:
print('无该学生信息')
break
Show()
answer = input('是否继续删除?y/n\n')
if answer.lower()=='y':
continue
else:
break
def Search():
student_query = []
while True:
id = ''
name = ''
if os.path.exists(filename):
mode = input('按ID查找请输入1,按姓名查找请输入2:')
if mode == '1':
id = input('请输入学生ID:')
elif mode == '2':
name = input('请输入学生姓名:')
else:
print('您的输入有误,请重新输入')
Search()
with open(filename, 'r', encoding='utf-8') as rfile:
student = rfile.readlines()
for item in student:
d = dict(eval(item))
if id != '':
if d['id'] == id: #比对输入的id和文件内的信息id,若相等则添加本条字典信息到空列表中
student_query.append(d)
if name != '':
if d['name'] == name:
student_query.append(d)
# 显示查询结果
show_student(student_query)
# 清空列表
student_query.clear()
answer = input('是否要继续查询?y/n :')
if answer.lower() == 'y':
continue
else:
break
def Modify():
Show()
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as rfile:
student_old = rfile.readlines()
else:
return
student_id = input('请输入要修改的学员的ID:')
if student_id != '':
with open(filename, 'w', encoding='utf-8') as wfile:
for item in student_old:
d = dict(eval(item))
if d['id'] == student_id:
print('找到该学生信息,可以修改他的相关信息了!')
try:
d['id'] = input('请输入新的ID:')
d['name'] = input('请输入姓名:')
d['chinese'] = int(input('请输入语文的成绩:'))
d['maths'] = int(input('请输入数学的成绩:'))
d['english'] = int(input('请输入英语的成绩:'))
d['physics'] = int(input('请输入物理的成绩:'))
except:
print('您的输入有误,请重新输入!!!')
wfile.write(str(d) + '\n')
print('修改成功!')
else:
wfile.write(str(d) + '\n')
answer = input('是否继续修改其他学生的信息?y/n:')
if answer == 'y' or answer == 'Y':
Modify()
def Sort():
#定义一个全局变量,当Sort()函数结束时,保存变量的文字信息,供后面print()函数调用
#调用Show()函数,显示源文件中的所有学生信息
#利用os.path.exists()函数判断是否在本地硬盘存在源文件filename
#若本地存在文件则以只读方式打开文件,同时读取信息到内存,保存到列表student_list中
#建立一个空列表student_new,从内存的列表student_list遍历出每一带引号的字典项item
#然后利用eval()函数,把item两边的引号去掉,还原成字典格式,并存入变量d中
#然后利用append()函数把变量d中的字典数据添加到定义好的空列表student_new中
#如果源文件中不存在学生成绩信息,则执行print()函数后,return退出
#利用input函数,接收01字符,确定排序成绩的升降序方式,同时利用前面定义的全局变量asc_str接收字符
#利用asc_or_desc_bool变量,接收True和False来实现参数设置,以完成sort()函数的升降序设置
#然后对存入列表中的字典分别进行各科成绩进行排序,这里有2个知识点:sort()函数,lambda,现分别讲述
#sort()函数,对全部字典数据,按其参数key=接收字典中键名为指定名称某学科,存入lambda中的x内
# 利用int(x['chinese']),按照整数的形式进行成绩数据的排列,reverse=True/False进行升或降的排序
# 利用if elif函数,进行每个学科的单独设置排序
global asc_str
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:
print('文件中无学生信息')
return
asc_or_desc = input('请选择(0.升序 1.降序):')
if asc_or_desc == '0':
asc_str = '升'
asc_or_desc_bool = False
elif asc_or_desc == '1':
asc_str = '降'
asc_or_desc_bool = True
else:
Sort()
mode = int(input('请选择排序方式(1.按语文排序 2.按数学排序 3.按英语排序 4.按物理排序 0.按总成绩排序):'))
sub_num = ['总成绩','语文','数学','英语','物理']
print('++++',student_new)
if mode == 1:
student_new.sort(key=lambda x: int(x['chinese']), reverse=asc_or_desc_bool)
elif mode == 2:
student_new.sort(key=lambda x: int(x['maths']), reverse=asc_or_desc_bool)
elif mode == 3:
student_new.sort(key=lambda x: int(x['english']), reverse=asc_or_desc_bool)
elif mode == 4:
student_new.sort(key=lambda x: int(x['physics']), reverse=asc_or_desc_bool)
elif mode == 0:
student_new.sort(key=lambda x: int(x['chinese']) + int(x['maths']) + int(x['english']) + int(x['physics']),
reverse=asc_or_desc_bool)
else:
Sort()
show_student(student_new)
print(f'\n本次排序是---{sub_num[mode]}成绩---进行({asc_str}序)排序\n')
def Total():
pass #信息汇总
def Show():
#思路分析
# 定义一个空列表,判断文件内部是否含有数据,若有,就读取数据
#把读取数据保存到变量students列表中
#利用for in 对students列表中的字典进行提取,此处提取到的是带有字符属性的事引号的字典项item
#处理item,去除其两侧的引号,还原字典数据信息,并把信息保存到空列表stu_lst中
stu_lst = []
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8')as rfile:
students = rfile.readlines()
#print(students)
for item in students: #遍历列表中的字典'{...}'
stu_lst.append(eval(item)) # 去除字典两边引号{},添加到列表stu_lst列表中
if stu_lst:
show_student(stu_lst) #把处理好的列表信息文件,送入show_student()函数,显示
else:
print('暂未保存过数据!') #若硬盘的源文件中无数据,则显示print函数
def show_student(lst):
#判断接收到的lst(形参)---对应上在的stu_lst含有字典的列表
#使用Len()函数判断列表的长度是否为0,如果为零,输出print函数,并退出,如果不为零,则先定义一个格式:格式为居中,数字为总宽度,同时用分隔符分隔
#使用print()函数把定义好的格式,用format函数和显示列表的表头连起来,显示在python中
#for in 函数把列表中的字典依次从lst形参中取出来,同时利用字典中的item.get('键名')函数,取到对应的值value
#
if len(lst) == 0: #判断
print('没有查询到学生信息!!!')
return
#定义标题显示格式
format_title = '{:^6}\t{:^13}\t{:^10}\t{:^6}\t{:^10}\t{:^6}\t{:^7}' #定义显示表头格式
print(format_title.format('ID','姓名','语文成绩','数学成绩','英语成绩','物理成绩','总成绩')) #按格式输出表头
format_data = '{:^6}\t{:^13}\t{:^10}\t{:^18}\t{:^7}\t{:8}\t{:^17}' #定义数据格式
for item in lst:
print(
format_data.format(item.get('id'),item.get('name'),item.get('chinese'),
item.get('maths'),item.get('english'),item.get('physics'),
int(item.get('chinese')) + int(item.get('maths')) + int(item.get('english'))+ int(item.get('physics'))
)
) #按格式显示字典内各科成绩到python内部
if __name__=='__main__':
Main()
理论分析:通过一组多列的数据字典,组建列表,建立一个格式变量,利用for in函数,从列表中取出字典,然后利用格式变量+format(获取字典内每个键的值),输出到python显示出来。
format函数
dict = [{'a':1,'b':4,'c':13,'d':8,'e':10,'f':19},
{'a':3,'b':6,'c':12,'d':8,'e':6,'f':29},
{'a':5,'b':9,'c':16,'d':8,'e':12,'f':49},
{'a':7,'b':12,'c':18,'d':8,'e':15,'f':69}]
if __name__ == '__main__':
while True:
pxm = input('请输入按字母a,b,c,d,e,f排序')
px = dict.sort(key=lambda x: int(x[pxm]), reverse=False)
#题目格式 {:^6}\t
format_topic = '{:^6}\t{:^6}\t{:^6}\t{:^6}\t{:^6}\t{:^6}'
print(format_topic.format('a','b','c','d','e','f'))
for con in dict:
print(format_topic.format(
con.get('a'),
con.get('b'),
con.get('c'),
con.get('d'),
con.get('e'),
con.get('f')
))
对硬盘内文件进行加工并按关键字排序的流程