这个是实现查看excel文件中学生成绩的平均分、最高分、最低分、高于平均分的学生和低于平均分的学生、查找最高分的学生和最低分的学生、前三名、将成绩排名信息写入csv格式的文件中、将前三名学生在图片中水印显示。
pandas:
Pandas是一种流行的开源Python库,用于数据处理、分析和预处理。它提供高性能、易于使用的数据结构和数据分析工具,用于处理结构化数据。
csv:
csv模块是Python的内置模块,用于读取和写入CSV(逗号分隔值)文件。它提供了一组函数和类,使您能够轻松地处理CSV文件中的数据。
datetime:
datetime模块是Python的内置模块,用于处理日期和时间。它提供了一组类和函数,使您能够创建、操作和格式化日期和时间对象。
PIL:
PIL 是一个广泛使用的第三方图像处理库,用于在Python中处理和操作图像。
isinstance:
isinstance()
是一个内置函数,用于检查一个对象是否属于指定的类型。
enumerate:
enumerate()
是一个内置函数,用于将一个可迭代对象组合为一个索引序列,同时返回索引和对应的元素值。
sorted:
sorted()
是一个内置函数,用于对可迭代对象进行排序并返回一个新的排序后的列表。
代码在下面:
import pandas as pd
import csv
import datetime
from PIL import Image, ImageDraw, ImageFont
# 读取Excel文件
try:
df = pd.read_excel("你的excel文件名字.xlsx")
except FileNotFoundError:
print("文件未找到,请确认文件路径是否正确。")
exit()
dict_n = {}
l1 = []
l2 = []
data = []
for i, j in df.iterrows():
# 判断是否为字符串
if isinstance(j[1], str):
continue
else:
l1.append(j[0])
l2.append(j[1])
data.append([j[0], j[1]])
# 计算最低分和最高分
min_score = min(l2)
max_score = max(l2)
# 平均分
c = round(sum(l2) / len(l2), 1)
# 根据分数获取分数最高和最低的同学的名称及分数
highest_students = [name for index, name in enumerate(l1) if l2[index] == max_score]
lowest_students = [name for index, name in enumerate(l1) if l2[index] == min_score]
dict2 = {} # 存储高于平均值的同学
dict3 = {} # 存储低于平均值的同学
for index, n in enumerate(l2):
if n > c:
dict2[l1[index]] = n # 将高于平均值的同学和分数添加到字典中
else:
dict3[l1[index]] = n # 将低于平均值的同学和分数添加到字典中
print(f'平均分:{c}')
print(f"最低分:{min_score}")
print(f"最高分:{max_score}")
print(f"分值最高的同学:{', '.join(highest_students)},分数:{max_score}")
print(f"分值最低的同学:{', '.join(lowest_students)},分数:{min_score}")
print(f"高于平均值:{dict2}")
print(f"低于平均值:{dict3}")
# 生成时间戳
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
output_filename = f"csv文件的名字.csv"
# 打开 CSV 文件并写入数据
with open(output_filename, 'w', encoding='utf-8' , newline='') as file:
writer = csv.writer(file)
writer.writerows(data)
# 使用sorted函数按分数降序排序字典数据
top_scores = sorted(data, key=lambda x: x[1], reverse=True)
# 获取前三名的学生姓名和分数
top_three = top_scores[:3]
print(top_three)
# 创建空白图片
image = Image.new("RGB", (800, 600), (255, 255, 255))
# 绘制图像内容
draw = ImageDraw.Draw(image)
draw.rectangle([(100, 100), (700, 500)], fill=(0, 0, 255)) # 画一个蓝色矩形
# 设置字体和字号
font = ImageFont.truetype("C:/Windows/Fonts/simsun.ttc", 24)
# 设置水印文本
text = "学生姓名:" + "、".join([name for name, _ in top_three])
# 在图片上绘制水印文本
draw.text((100, 270), text, fill=(0, 0, 0), font=font)
# 保存生成的图片
image.save("image1.png")