实验目的:
1、了解扩展库 openpyxl 的安装与使用。
2、熟练运用字典结构解决实际问题。
实验内容:
假设某学校所有课程每学期允许多次考试,学生可随时参加考试,系统自动将每次成绩
添加到 Excel 文件(包含 3 列:姓名,课程,成绩)中,现期末要求统计所有学生每门课
程的最高成绩。
编写程序,模拟生成若干同学的成绩并写入 Excel 文件,其中学生姓名和课程名称均可重复,也就是允许出现同一门课程的多次成绩,最后统计所有学生每门课程的最高成绩,并写入新的 Excel 文件。
实验步骤:
1、在命令提示符环境使用 pip install openpyxl 命令安装扩展库 openpyxl。
2、编写代码。
下面展示一些 代码。
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)