思政课成绩统计

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))
上一篇下一篇

猜你喜欢

热点阅读