对考试成绩的excel文件进行操作:
1. 输出所有同学“名称:对应成绩”的信息
2. 输出分值最高和最低的同学名称及分数,(如有重复并列输出)
3. 求出平均值并输出
4. 输出高于平均值的同学名称及成绩
5. 输出低于平均值的同学名称及成绩
6. 将成绩排名信息写入csv格式的文件中,文件名称为:test_你自己的名字_时间戳.csv
7. 生成一个图片,将前三名信息水印在这张图片上,将图片保存在
# python的内置库 time
import time
# 操作excel文件的第三方库
import pandas as pd
# 用来操作表格文件的第三方库
import csv
# 操作图片的第三方库; 如果没安装使用pip安装下面
# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow
from PIL import Image, ImageDraw, ImageFont
# 操作excel文件
ff = pd.read_excel("abc.xlsx")
# 接收姓名和成绩
dict_n = {}
# 接收姓名和成绩列表套列表
data = []
# 接收所有的成绩
he = []
# 最高分
ghe = {}
# 最低分
dhe = {}
# 接收成绩后三名
zhuidi = []
# 接收成绩前三名
zhuigao = []
# 循环excel的内容
for i, j in ff.iterrows():
# isinstance判断一个对象是不是字符串
if isinstance(j[1], str):
# 这一步是为了去除掉不是成绩的数据 如:(未参加等)
continue
else:
# 存入
dict_n[j[0]] = j[1]
data.append([j[0], j[1]])
# 循环 dict_n 用。values来获取成绩存到he列表里面
for n in dict_n.values():
he.append(n)
# 计算平均成绩
# 平均值有小数点所以用round方法限制小数后面只能有一位
# sum是求列表的和; 前提条件列表里面的都是数字
c = round(sum(he) / len(data), 1)
# 接收高于平均值的数据
a = []
# 接收都于平均值的数据
d = []
# 为什么写着两个列表; 为了输出格式好看,美观一点
# 循环便利字典的键值对; i代表键 j代表值
for i, j in dict_n.items():
# 判断条件 大于平均值 存入a列表里
if j > c:
b = f"{i}{j}"
a.append(b)
# 判断条件 小于平均值 存入b列表里
elif c > j:
f = f"{i}{j}"
d.append(f)
# 存入数据
ghe['高于平均值'] = a
dhe['低于平均值'] = d
# 字典排序使用了sorted方法和匿名函数; 升序
top_scores = sorted(dict_n.items(), key=lambda x: x[1], reverse=True)
# 给定义个默认值
qian3 = None
# 循环便利字典的键值对
for i, j in dict_n.items():
# 判断排序过的下标为0里面下标为1 的数据等不等于 j
# 0 代表列表的第一位
if top_scores[0][1] == j:
# 符合条件找出最高分的成绩
h = f"{i}{j}"
zhuigao.append(h)
# 判断排序过的下标为-1里面下标为1 的数据等不等于 j
# -1 代表列表的最后一位
elif top_scores[-1][1] == j:
# 符合条件找出最低分的成绩
t = f"{i}{j}"
zhuidi.append(t)
else:
# 前三名和后三名的成绩 通过切片获取数据后 在 +号合并
qian3 = top_scores[:3] + top_scores[-3:]
# 使用time模块获取时间戳
ti = time.time()
# tx变量 是当文件的名称
tx = f"test_zwj_{ti}.csv"
# 打开 CSV 文件
with open(tx, 'w', newline='') as file:
# 创建 CSV 写入器
writer = csv.writer(file)
# 写入数据行
for row in data:
writer.writerow(row)
# 创建一张空白图片
width, height = 600, 400
image = Image.new('RGB', (width, height), color='white')
# 加载字体
font_path = 'arial.ttf'
font_size = 20
font = ImageFont.truetype(font_path, font_size)
# 准备要添加的水印文本
s = {}
for name, score in qian3:
s[name] = score
watermark_text = str(s)
# 创建绘图对象
draw = ImageDraw.Draw(image)
# 将水印文本添加到图片上
draw.text((10, 10), watermark_text, fill='black', font=font)
# 保存图片
image.save('watermarked_image.png')
print(f'最高分:{zhuigao}')
print(f'最低分:{zhuidi}')
print(ghe)
print(dhe)
print(f'平均分:{c}')
print("图片已保存成功。")
完成!!!