实验9 处理Excel文件中的成绩数据

Python语言程序设计基础》实验报告

题目

实验9 处理Excel文件中的成绩数据

姓名

姜智浩

日期:2024.12.9

实验目的:

(1)了解扩展库openpyxl的安装与使用。

(2)了解使用扩展库openpyxl操作Excel文件的方法。

(3)熟练运用字典结构解决实际问题。

实验内容:

假设某学校所有课程每学期允许多次考试,学生可随时参加考试,系统自动将每次成绩添加到Excel文件(包含3列:姓名,课程,成绩)中,现期末要求统计所有学生每门课程的最高成绩。

编写程序,模拟生成若干同学的成绩并写入Excel文件,其中学生姓名和课程名称均可重复,也就是允许出现同一门课程的多次成绩,最后统计所有学生每门课程的最高成绩,并写入新的Excel文件。

实验环境:

Windows 10/11 + Jupyter Notebook \ PyCharm \ Spyder \ VScode + Python 3.12

实验内容与完成情况:

from random import choice, randint
from openpyxl import Workbook, load_workbook

# 生成随机数据
def generateRandomInformation(filename):
    workbook = Workbook()
    worksheet = workbook.worksheets[0]
    worksheet.append(['姓名','课程','成绩'])

    # 中文名字中的第一、第二、第三个字
    first = '赵钱孙李'
    middle = '伟昀琛东'
    last = '坤艳志'
    subjects = ('语文','数学','英语')
    for i in range(200):
        name = choice(first)
        # 按一定概率生成只有两个字的中文名字
        if randint(1,100)>50:
            name = name + choice(middle)
        name = name + choice(last)
        # 依次生成姓名、课程名称和成绩
        worksheet.append([name, choice(subjects), randint(0, 100)])
    # 保存数据,生成Excel 2007格式的文件
    workbook.save(filename)

def getResult(oldfile, newfile):
    # 用于存放结果数据的字典
    result = dict()

    # 打开原始数据
    workbook = load_workbook(oldfile)
    worksheet = workbook.worksheets[0]

    # 遍历原始数据
    for row in worksheet.rows:
        if row[0].value == '姓名':
            continue
        # 姓名,课程名称,本次成绩
        name, subject, grade = map(lambda cell:cell.value, row)

        # 获取当前姓名对应的课程名称和成绩信息
        # 如果result字典中不包含,则返回空字典
        t = result.get(name, {})
        # 获取当前学生当前课程的成绩,若不存在,返回0
        f = t.get(subject, 0)
        # 只保留该学生该课程的最高成绩
        if grade > f:
            t[subject] = grade
            result[name] = t

    workbook1 = Workbook()
    worksheet1 = workbook1.worksheets[0]
    worksheet1.append(['姓名','课程','成绩'])

    # 将result字典中的结果数据写入Excel文件
    for name, t in result.items():
        print(name, t)
        for subject, grade in t.items():
            worksheet1.append([name, subject, grade])

    workbook1.save(newfile)

if __name__ == '__main__':
    oldfile = r'd:\test.xlsx'
    newfile = r'd:\result.xlsx'
    generateRandomInformation(oldfile)
    getResult(oldfile, newfile)

结果

钱东坤 {'数学': 15}
李志 {'英语': 95, '数学': 57, '语文': 97}
孙志 {'英语': 48, '数学': 95, '语文': 98}
孙昀志 {'语文': 10}
钱琛艳 {'数学': 2, '语文': 74}
孙坤 {'数学': 70, '英语': 14, '语文': 63}
钱坤 {'语文': 57, '数学': 100, '英语': 95}
赵伟志 {'数学': 61, '英语': 17}
钱志 {'语文': 95, '数学': 100, '英语': 86}
赵东坤 {'语文': 72, '英语': 74}
李坤 {'语文': 55, '数学': 75, '英语': 74}
赵东志 {'数学': 12, '英语': 46}
赵志 {'英语': 86, '语文': 5, '数学': 96}
赵昀艳 {'英语': 93}
李东坤 {'语文': 62}
李东艳 {'语文': 79, '数学': 97, '英语': 42}
孙伟坤 {'语文': 88, '英语': 16}
钱伟坤 {'数学': 96}
孙东坤 {'数学': 23, '英语': 11}
钱艳 {'数学': 98, '英语': 92, '语文': 70}
李琛艳 {'语文': 93}
孙琛志 {'语文': 49, '英语': 63, '数学': 16}
李伟坤 {'语文': 47, '数学': 29}
钱昀坤 {'英语': 6}
孙昀坤 {'语文': 45, '英语': 84}
钱琛志 {'数学': 73, '英语': 58}
孙琛坤 {'英语': 72, '数学': 25}
李伟艳 {'语文': 63, '英语': 42}
孙艳 {'数学': 64, '语文': 74}
钱昀艳 {'数学': 19}
赵琛志 {'英语': 34, '数学': 6}
赵坤 {'数学': 8, '语文': 72}
孙伟艳 {'数学': 83}
赵艳 {'英语': 87, '语文': 81}
李昀坤 {'语文': 20, '英语': 77}
李昀艳 {'数学': 3}
赵伟艳 {'语文': 90, '数学': 17}
赵昀志 {'数学': 59}
李伟志 {'语文': 64, '数学': 98, '英语': 13}
赵东艳 {'英语': 54, '语文': 20}
钱伟艳 {'语文': 95}
赵琛艳 {'英语': 60}
李艳 {'数学': 32, '语文': 33}
孙东志 {'数学': 25, '英语': 7}
钱东志 {'英语': 13, '语文': 29}
赵昀坤 {'数学': 38, '英语': 59, '语文': 6}
孙伟志 {'英语': 69}
孙琛艳 {'数学': 98, '语文': 81}
钱昀志 {'数学': 64, '英语': 30}
李东志 {'英语': 99, '语文': 84}
孙东艳 {'语文': 92}

遇到的困难:

不理解

result.get(name, {})
f = t.get(subject, 0)
if grade > f:
    t[subject] = grade
    result[name] = t

解决方案:

查询后得知

result.get(name, {}) 用于从字典中获取学生的成绩,如果学生没有记录则返回一个空字典。这样做是为了避免当学生第一次出现时,result[name] 为 None 的错误。

t.get(subject, 0) 用来获取学生某门课程的成绩,如果没有成绩,则默认返回 0,然后用 if grade > f: 来保留每个学生该课程的最高成绩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值