python学习:pandas+统计科目总分+生成奖状

步骤

  1. 输入表格有几门科目
  2. 输入科目的名称
  3. 获取表格有多少学生
  4. 生成多少个学生的姓名加入excel表格(因为懒得想名字,于是随机生成)
  5. 计算每个人的总分
  6. 输入要生成前多少名的奖状
  7. 输入要生成哪个科目前几名的奖状
  8. 进行排序并获取到前面的姓名
  9. 生成奖状

准备的材料   标题下有我的材料

  1. 字体素材ttf
  2. 奖状的模型图片
  3. excel的表格,里面有各个科目的分数和编号(从1开始,表示有多少人),可以加名字,也可以不加,我懒的加

代码

  1. 导包

    import random, qrcode
    from PIL import Image, ImageDraw, ImageFont
    import pandas as pd
  2. #导出新文件excel,df是pandas对象,name是导出文件的名字

    #导出新文件excel,df是pandas对象,name是导出文件的名字
    def save_excel(df,name):
        df.to_excel(name,index=False)#false不加行号
  3. #算出总成绩 filename是要打开的文件名  newfilename是处理完导出的文件名  numlist是科目列表

    #算出总成绩 filename是要打开的文件名  newfilename是处理完导出的文件名  numlist是科目列表
    def sum_number(filename, newfilename, numlist):
        df = pd.read_excel(filename)#打开excel文件
        # 计算指定列的总和
        #将对df的numlist指定的列进行逐行求和,生成一个新的列'总分',该列中每个元素是对应行numlist列的数字求和得到的结果
        #.sum(axis=1)表示沿着行的方向计算总和
        df['总分'] = df[numlist].sum(axis=1)
        save_excel(df,newfilename)#导出
  4. #获取有多少人,filename是打开的文件名

    #获取有多少人,filename是打开的文件名
    def get_num(filename):
        df = pd.read_excel(filename)
        return list(df["编号"])[-1]#获取编号这一列转为列表然后返回最后一位
  5. #随机起名,添加到列表里

    #随机起名,添加到列表里
    def rand_name():
        xing = '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜'
        ming = '豫章故郡洪都新府星分翼轸地接衡庐襟三江而带五湖控蛮荆而引瓯越物华天宝龙光射牛斗之墟人杰地灵徐孺饯子'
        #在xing里随机获取一个字,加上ming里获取两个字组成字符串名字
        name = random.choice(xing)+''.join(random.sample(ming, 2))
        #遍历加入到列表里,并返回名字
        if name not in names:
            names.append(name)
            return name
        return None
  6. #将名字列表存入excel里再导出新的一份

    #将名字列表存入excel里再导出新的一份
    #filename是打开的文件名
    #newfilename导出的文件名
    #names_list名字列表
    def save_name(filename,newfilename,names_list):
        df = pd.read_excel(filename)
        df["姓名"] = names_list#用名字列表替换掉原来的姓名这一列
        save_excel(df,newfilename)#导出
  7. #打印excel表格

    #打印excel表格
    def print_excel(filename):
        df = pd.read_excel(filename)
        print(df)
  8. #排序

    #排序
    #filename是打开的文件名
    def paixu(filename):
        df = pd.read_excel(filename)#打开文件
    
        print("请输入生成前几名的奖状")
        np = eval(input())
    
        print("请输入按什么类别排序来生成前几名奖状,如总分,或者科目名称")
        n = input()
    
        daxie = {
            "1": "一","2": "二","3": "三","4": "四","5": "五",
            "6": "六","7": "七","8": "八","9": "九","10": "十"
        }
        #循环查字典组成哪个科目第几名,然后存列表里
        for i in range(np):
            lis.append(n + "第" + daxie.get(str(i + 1), "未找到对应的值") + "名")
    
        #判断是要用哪个列来进行降序排列
        if n in df:#判断有没有这一列
            sort_df = df.sort_values(by=n, ascending=False)#false降序
            #print(list(sort_df["姓名"])[0:np])
            return list(sort_df["姓名"])[0:np]#返回排序后的前几行,转为列表返回
        # elif n == "总分":
        #     sort_df = df.sort_values(by=n, ascending=False)
        #     #print(list(sort_df["姓名"])[0:np])
        #     return list(sort_df["姓名"])[0:np]
        else:
            print("错误输入")
  9. #生成奖状

    #生成奖状
    #text 名字
    #text2 科目+第几名
    def generate_poster(text,text2):
        # 打开海报文件
        template = Image.open(r"./海报模板1.png")
        # 使用ImageDraw进行绘图
        draw = ImageDraw.Draw(template)
        # 使用ImageFont选择字体
        font = ImageFont.truetype(r"./xx.ttf", 80)
        # 在海报上添加文字
        draw.text((500, 290), text, font=font, fill=(0, 0, 0))
        # 使用ImageFont选择字体
        font = ImageFont.truetype(r"./xx.ttf", 50)
        # 在海报上添加文字
        draw.text((500, 500), text2, font=font, fill=(0, 0, 0))
        # 展示海报
        template.show()
        # 保存海报
        template.save(text + ".png")
  10. #主函数

    if __name__ == '__main__':
        #制作表格
        init_filename = input("请输入表格的名字:")
        #init_filename = "成绩.xlsx"
        name_filename = "成绩1.xlsx"
        namesum_filename = "成绩2.xlsx"
    
        #获取有几位科目
        sum_num=int(input("几位科目"))
        #获取科目名称
        sum_list = []
        for i in range(sum_num):
            sum1=input("科目名称")
            sum_list.append(sum1)
        #获取有几位学生
        num = get_num(init_filename)
        #随机生成名字并加到列表里
        names = []
        #随机生成名字
        for i in range(num):
            name = rand_name()
            while name is None:
                name = rand_name()
        #将名字加入表格
        save_name(init_filename, name_filename, names)
        #计算总分
        sum_number(name_filename, namesum_filename, sum_list)
    
        #排序,返回第一句话 和第二句话
        lis = []#存放科目第几名
        end_name_list = paixu(namesum_filename)
    
        #生成奖状
        for i in range(len(end_name_list)):
            generate_poster(end_name_list[i],lis[i])
    
        #print_excel(namesum_filename)

你可能感兴趣的:(学习)