思政课成绩统计
2021-05-27 本文已影响0人
Noza_ea8f
main.py
import xlrd
import pandas as pd
from xlutils.copy import copy
from lib.func import auto_fill_0, get_ls_max_len
path = '2019.7期末考试成绩最终发布.xls'
rb = xlrd.open_workbook(path, formatting_info=True)
wb = copy(rb)
sheet = rb.sheet_by_name('sheet1')
# 获取行列数
rows = sheet.nrows
cols = sheet.ncols
# class_sz = ['04389', '04385', '04391', '04390', '04384']
# 思政课字典
class_sz = {'04389': [], '04385': [], '04391': [], '04390': [], '04384': []}
# 获取所有思政课成绩
for row in range(0, rows):
for col in range(0, cols):
# 逐行逐列获取每个单元格的值
val = sheet.cell_value(row, col)
# 将获取的值在字典中进行比对
for k, v in class_sz.items():
# 如果找到了课程ID
if val == k:
# 跳过两行,因为下一行是课程名称
new_row = row + 2
# 从该列开始往下逐行查询
for i in range(new_row, rows):
# 获取成绩值
score = sheet.cell_value(i, col)
# 左侧A列数值长度,因为最左侧列是学号,长度为13
A_len = len(sheet.cell_value(i, 0))
# 如果左侧A列数值不等于13
if A_len != 13:
break
elif score != '':
v.append(score)
d = auto_fill_0(d=class_sz, max_l=get_ls_max_len(class_sz))
# print(d)
# 写入Excel
df = pd.DataFrame(d)
writer = pd.ExcelWriter('xx.xlsx')
df.to_excel(writer, index=False)
writer.save()
func.py
import sys
sys.setrecursionlimit(100000) # 设置递归深度(可为任意值)
# 运用递归将所有列表长度统一
def auto_fill_0(d, max_l):
for k, v in d.items():
if len(v) < max_l:
v.append(0)
auto_fill_0(d, max_l)
return d
# 这是一个字典
# d = {'a': [1, 2],
# 'b': [3, 4, 5],
# 'c': [6],
# 'd': [7, 8]}
# 我要找出字典中值列表最长的列表长度
def get_ls_max_len(d):
ls = []
for k, v in d.items():
ls.append(len(v))
ls = sorted(ls)
# 最长的列表长度
max_l = ls[-1]
return max_l
# print(get_ls_max_len(d))