import pandas as pd
import csv
import datetime
from PIL import Image, ImageDraw, ImageFont
# 读取Excel文件
try:
# read_excel() 是 pandas 库中用于读取Excel文件的函数。
# 它可以从Excel文件中读取数据,并将其转换为Pandas的DataFrame数据结构
df = pd.read_excel("2209A2361-第一轮面试成绩.xlsx")
except FileNotFoundError:
print("文件未找到,请确认文件路径是否正确。")
exit()
data_name = []
data_grade = []
data = []
# iterrows()是pandas中用于迭代DataFrame行的方法。
# 它允许你按行遍历DataFrame,并针对每一行执行操作
for i, j in df.iterrows():
# 判断是否为字符串
if isinstance(j[1], str):
continue
else:
data_name.append(j[0])
data_grade.append(j[1])
data.append([j[0], j[1]])
# 计算最低分和最高分
min_score = min(data_grade)
max_score = max(data_grade)
# 平均分
# round() 是Python内置的函数,用于对数字进行四舍五入
retain_name = round(sum(data_grade) / len(data_grade), 1)
# 根据分数获取分数最高和最低的同学的名称及分数
highest_students = [name for name, score in zip(data_name, data_grade) if score == max_score]
lowest_students = [name for name, score in zip(data_name, data_grade) if score == min_score]
dict2 = {} # 存储高于平均值的同学和分数的字典
dict3 = {} # 存储低于平均值的同学和分数的字典
# enumerate() 是Python内置的函数,用于在迭代器过程中同时获取索引和元素
for index, n in enumerate(data_grade):
if n > retain_name:
dict2[data_name[index]] = n # 将高于平均值的同学和分数添加到字典中
else:
dict3[data_name[index]] = n # 将低于平均值的同学和分数添加到字典中
### 将成绩排名信息写入csv格式的文件中,文件名称为:test_你自己的名字_时间戳.csv ###
date = datetime.datetime.utcnow().timestamp() # 当前时间戳
file_name = f'test_鲁健_{date}.csv'
try:
with open(file_name, 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(data)
except IOError:
print('I/O error')
### 生成一个图片,将前三名信息水印在这张图片上,将图片保存 ###
sorted_lst = sorted(data, key=lambda x: x[1], reverse=True)[:4]
print(sorted_lst)
# 创建空白图片
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 sorted_lst])
# 在图片上绘制水印文本
draw.text((100, 270), text, fill=(0, 0, 0), font=font)
# 保存生成的图片
image.save('image01.jpg')
# print(f'平均分:{retain_name}')
# 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}")