Python小项目(学生成绩管理系统)
第七天:排序、显示部分
一.sort()部分
对于排序部分,首先要做的是判断是否存在.txt文件,并用readlines方法,读取.txt文件内的信息。
def sort():if os.path.exists(filename): #判断是否存在.txt文件with open(filename,'r',encoding='UTF-8') as file:student_old= file.readlines()#把文件内容放到student_old里#print('输出student_old')#print(student_old)student_new = []for item in student_old:d = dict(eval(item))#print('输出d')#print(d)student_new.append(d)#print('输出student_new')#print(student_new)else:return
=========================================================================
这里如果不清楚student_old、d、student_new分别有哪些数据,可以跑一下上面#内的代码。
首先,student.txt文件内有1,2,3,4四个学生的信息。然后我们跑一遍代码,看看输出的内容。
这里我们可以发现,因为readlines是一次性全部读取.txt文件内的信息,所以student_old中,一共有四条学生信息。且这是一个列表。
student_old =
["{'name': '1', 'id': '1', 'chinese': '1', 'math': '1', 'english': '1'}\n",
"{'name': '2', 'id': '2', 'chinese': 2, 'math': 2, 'english': 2}\n",
"{'name': '3', 'id': '3', 'chinese': 3, 'math': 3, 'english': 3}\n",
"{'name': '4', 'id': '4', 'chinese': 4, 'math': 4, 'english': 4}\n"]
接下来,开始遍历student_old,拿出第一个,将他改成字典,给d,然后添加入new中:
第一次遍历
输出d {'name': '1', 'id': '1', 'chinese': '1', 'math': '1', 'english': '1'} 输出student_new [{'name': '1', 'id': '1', 'chinese': '1', 'math': '1', 'english': '1'}]
第二次遍历
输出d {'name': '2', 'id': '2', 'chinese': 2, 'math': 2, 'english': 2} 输出student_new [{'name': '1', 'id': '1', 'chinese': '1', 'math': '1', 'english': '1'}, {'name': '2', 'id': '2', 'chinese': 2, 'math': 2, 'english': 2}]
第三次遍历
输出d {'name': '3', 'id': '3', 'chinese': 3, 'math': 3, 'english': 3} 输出student_new [{'name': '1', 'id': '1', 'chinese': '1', 'math': '1', 'english': '1'}, {'name': '2', 'id': '2', 'chinese': 2, 'math': 2, 'english': 2}, {'name': '3', 'id': '3', 'chinese': 3, 'math': 3, 'english': 3}]
第四次遍历
输出d {'name': '4', 'id': '4', 'chinese': 4, 'math': 4, 'english': 4} 输出student_new [{'name': '1', 'id': '1', 'chinese': '1', 'math': '1', 'english': '1'}, {'name': '2', 'id': '2', 'chinese': 2, 'math': 2, 'english': 2}, {'name': '3', 'id': '3', 'chinese': 3, 'math': 3, 'english': 3}, {'name': '4', 'id': '4', 'chinese': 4, 'math': 4, 'english': 4}]
最后,我们对比一下old和new中的内容有何区别:
student_old =
["{'name': '1', 'id': '1', 'chinese': '1', 'math': '1', 'english': '1'}\n",
"{'name': '2', 'id': '2', 'chinese': 2, 'math': 2, 'english': 2}\n",
"{'name': '3', 'id': '3', 'chinese': 3, 'math': 3, 'english': 3}\n",
"{'name': '4', 'id': '4', 'chinese': 4, 'math': 4, 'english': 4}\n"]
student_new= [{'name': '1', 'id': '1', 'chinese': '1', 'math': '1', 'english': '1'},
{'name': '2', 'id': '2', 'chinese': 2, 'math': 2, 'english': 2},
{'name': '3', 'id': '3', 'chinese': 3, 'math': 3, 'english': 3},
{'name': '4', 'id': '4', 'chinese': 4, 'math': 4, 'english': 4}]
可以看出,原student_old里是字符串格式,不好进行排序操作;经过一连串的转换格式操作,新的student_new里是
=========================================================================
接下来,选择1.降序或升序? 2.用什么成绩排列?
asc_or_desc = input('请选择(1.升序 | 2.降序):')if asc_or_desc == '1':asc_or_desc_bool = False #asc_or_desc的布尔值。elif asc_or_desc == '2':asc_or_desc_bool = Trueelse:print('输入错误,请重新输入。')time.sleep(2)sort()
注:我们需要了解 list.sort(reverse = Ture) 与list.sort(reverse = False) 的区别
下面来看两段代码:
a = [2,3,77,45,0]a.sort(reverse=False)print(a)#输出:[0, 2, 3, 45, 77]
a = [2,3,77,45,0]a.sort(reverse=True)print(a)#输出:[77, 45, 3, 2, 0]
也就是说 Fales表示升序、True表示倒序。所以我们需要先定义asc_or_desc的布尔值,以便后续的排序操作。
接下来,选择用什么成绩进行排序:
mode = input('请选择排序方式(1.语文成绩 | 2.数学成绩 | 3.英语成绩 | 4.总成绩):') #选按什么成绩排序。if mode == '1':student_new.sort(key = lambda student_new :int(student_new['chinese']),reverse = asc_or_desc_bool)elif mode == '2':student_new.sort(key = lambda student_new :int(student_new['math']),reverse = asc_or_desc_bool)elif mode == '3':student_new.sort(key = lambda student_new :int(student_new['english']),reverse = asc_or_desc_bool)elif mode == '4':student_new.sort(key = lambda student_new :int(student_new['chinese']) + int(student_new['math']) + int(student_new['english']),reverse = asc_or_desc_bool)else:print('输入错误,请重新输入。')time.sleep(2)sort()show_student(student_new)
单独拉出一行:
student_new.sort(key = lambda student_new :int(student_new['chinese']),reverse = asc_or_desc_bool)
key = lambda:我们需要用到参数key,也就是关键词,看下面这句命令,lambda是一个隐函数,是固定写法。
student_new :int(student_new['chinese']):student_new可以写任何东西,你可以直接写 x : int(x['chinese']) 。加int()需要将字符串内容改为整数类型(我们需要数字)。x['chinese']指调用字典中的语文成绩。
reverse = asc_or_desc_bool:上面有介绍reverse的用法。这里就等于False or True。
最后调用show()函数显示student_new。
二.show()部分
def show():student_lst = []if os.path.exists(filename): # 是否存在.txt文件with open(filename, 'r', encoding='UTF-8') as rfile:student = rfile.readlines()for item in student:student_lst.append(eval(item)) #遍历.txt文件 , 将每一行的内容写入student_lst中show_student(student_lst) #一行行写,全写完后,一起展示student_lstprint('所有信息显示完毕,即将返回主菜单。')time.sleep(2)
至此,该系统全部完成,此章完整代码如下:
def sort():if os.path.exists(filename): #判断是否存在.txt文件with open(filename,'r',encoding='UTF-8') as file:student_old= file.readlines()#把文件内容放到student_old里#print('输出student_old')#print(student_old)student_new = []for item in student_old:d = dict(eval(item))#print('输出d')#print(d)student_new.append(d)#print('输出student_new')#print(student_new)else:returnasc_or_desc = input('请选择(1.升序 | 2.降序):')if asc_or_desc == '1':asc_or_desc_bool = False #asc_or_desc的布尔值。elif asc_or_desc == '2':asc_or_desc_bool = Trueelse:print('输入错误,请重新输入。')time.sleep(2)sort()mode = input('请选择排序方式(1.语文成绩 | 2.数学成绩 | 3.英语成绩 | 4.总成绩):') #选按什么成绩排序。if mode == '1':student_new.sort(key = lambda student_new :int(student_new['chinese']),reverse = asc_or_desc_bool)elif mode == '2':student_new.sort(key = lambda student_new :int(student_new['math']),reverse = asc_or_desc_bool)elif mode == '3':student_new.sort(key = lambda student_new :int(student_new['english']),reverse = asc_or_desc_bool)elif mode == '4':student_new.sort(key = lambda student_new :int(student_new['chinese']) + int(student_new['math']) + int(student_new['english']),reverse = asc_or_desc_bool)else:print('输入错误,请重新输入。')time.sleep(2)sort()show_student(student_new) #显示排序好后的结果answer = str(input('是否继续排序操作? T/F: '))if answer == 'F':print('正在退出,请稍后。')time.sleep(2)returnelif answer == 'T':sort()else:print('输入错误。')time.sleep(2)sort()#函数(显示)部分def show():student_lst = []if os.path.exists(filename): # 是否存在.txt文件with open(filename, 'r', encoding='UTF-8') as rfile:student = rfile.readlines()for item in student:student_lst.append(eval(item)) #遍历.txt文件 , 将每一行的内容写入student_lst中show_student(student_lst) #一行行写,全写完后,一起展示student_lstprint('所有信息显示完毕,即将返回主菜单。')time.sleep(2)else:print('未找到相应数据。') # 不存在.txt文件time.sleep(2)menu()
(完)