目的:由全院成绩单导出单个班级的成绩单
并且计算总分、平均分、按照总分排名。
一、示例
- 下图为全院成绩单中一个同学本学年所有成绩;
需要使用的列有:班级、学号、姓名、课程名称、成绩、学分
- 下图为导出的班级成绩单
二、代码
第一次写,代码挺不简洁的,但是基本功能有的
import pandas as pd
import warnings
import openpyxl as op
#student类
class student:
def __init__(self, num):
self.num = num #学号
self.name = None #姓名
self.course = [] #课程名称
self.grade = [] #课程成绩
self.credit = [] #课程学分
# self.gpa = [] #课程绩点
# def __str__(self):
# return "".join(str(item) for item in (
# self.num, self.name, self.course, self.grade, self.credit, self.gpa
# ))
# 改变data的形式
def changeForm(stu, columns):
list = []
for i in range(len(stu)):
dict = {}
dict[columns[0]] = stu[i]["num"]
dict[columns[1]] = stu[i]["name"]
sum = 0.0
for j in range(2,len(columns) - 2):
temp = stu[i]['grade'][stu[i]['course'].index(columns[j])]
if((temp == '作弊') or (temp == '缓考') or (temp == '缺考') or (temp == '不及格')):
temp = 0
elif(temp == '优秀'):
temp = 95
elif(temp == '良好'):
temp = 85
elif((temp == '合格') or (temp == '中')):
temp = 75
elif(temp == '及格'):
temp = 65
dict[columns[j]] = float(temp) #各科成绩
sum = sum + float(temp)
dict[columns[j + 1]] = sum #总分
dict[columns[j + 2]] = round(sum / (len(columns) - 4),2) #平均值:round四舍五入保留两位有效数字
list.append(dict)
list.sort(key=lambda k: (k.get('总分', 0), k.get('学号', 1)), reverse=True) #排序:按照总分由大到小排序,若总分相同按学号由小到大排序
return list
#保存数据为excel表格
def op_toExcel(dataLists, fileName, columns): # openpyxl库储存数据到excel
wb = op.Workbook() # 创建工作簿对象
ws = wb['Sheet'] # 创建子表
ws.append(columns) # 添加表头
for dataList in dataLists:
d = tuple(dataList.values())
ws.append(d) # 每次写入一行
wb.save(fileName)
# 需要修改的位置
clas = 19070241
columns = ['学号', '姓名', 'Java高级程序设计', '计算机组成原理', '软件工程','数据库课程实验周','数据库原理及应用',
'传感器原理及应用(RFID)','数值分析','工程训练C', '操作系统', '总分', '平均分']
# 一、导入全院总成绩单
with warnings.catch_warnings(record=True):
warnings.simplefilter('ignore', ResourceWarning)
df = pd.DataFrame(pd.read_excel(r"2021-2022-1学期全院成绩.xlsx", engine="openpyxl"))
# 二、处理表格
df1 = df[["班级","学号","姓名","课程名称","成绩","学分","绩点"]]
data = df1[df1["班级"] == clas] # 得到指定班级的学生信息
numsList = list(dict.fromkeys(data["学号"].values.tolist()))
temp = []
for num in numsList:
stu = student(num)
records = data[data["学号"] == num]
stu.name = list(dict.fromkeys(records["姓名"].values.tolist()))[0]
for record in records:
stu.course = records["课程名称"].values.tolist()
stu.grade = records["成绩"].values.tolist()
stu.credit = records["学分"].values.tolist()
temp.append(stu.__dict__)
dataLists = changeForm(temp, columns)
# 三、保存表格数据
fileName = str(clas) + '.xlsx' #表名
op_toExcel(dataLists, fileName, columns)