|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2021-10-5 14:06:15
|
显示全部楼层
相比于楼上,增加了excel行数的读取,和处理数据的计算,通过对比两个数字,来判断是否全部数据都处理完。
- # 导入openpy模块,操作最后一步导出excel
- from openpyxl import Workbook #导入Excel模块
- wb = Workbook() #创建一个Excel文件
- sheet = wb.active #获取当前sheet名称
- sheet.title = "斑马救援积分明细" #修改sheet名称
- sheet['A1']= "姓名" #在A1 B1单元格输入内容
- sheet['B1']= "分数"
- # 导入pandas库,读取表格
- import pandas as pd
- #pd = pd.read_csv('002.csv',encoding='utf-8') #打开csv文件,读取内容
- pd = pd.read_excel('全部记录.xlsx') #打开excel文件,读取内容
- linesnum = pd.index.stop #excel数据行数
- #分别拿出参与人员和出勤类型数据,为创建元组做准备
- alllist = ','.join(pd['参与人员']) #用逗号拼接人员一列,此处生成不是列表,是字符串
- alllist = list(alllist.split(',')) #把上一步的字符串转成列表格式,以逗号为识别分割符
- classlist = '、'.join(pd['积分类型']) #拼接出勤类型成字符串
- classlist = list(classlist.split('、')) #把拼接出来的字符串转成列表
- x = 0 #储存处理数据的数目
- dalist = [] #创建一个空列表存放所有的姓名(重复姓名都在这里边)
- b = [] #创建空列表存放去重后的姓名
- # 创建元组,让出勤类型和出勤人员一一对应
- zidian = zip(classlist,alllist)
- # 循环元组内容,判断哪种类型应该积分多少
- for i in list(zidian):
- if i[0] == '1分':
- dalist.append(i[1].split('、'))
- x = x + 1
- elif i[0] == '2分':
- dalist.append(i[1].split('、')*2)
- x = x + 1
- elif i[0] == '3分':
- dalist.append(i[1].split('、')*3)
- x = x + 1
- else:
- print(f'积分类型为{i[0]}的数据有问题')
- #这一步,把大列表里面嵌套的小列表,全部清空,只把姓名拿出来放到一个列表b里
- for a in dalist:
- b.extend(a)
- name = set(b) #人员去重,每个名字只留下一个
- newlist = [] #创建空列表来存储姓名和次数
- for word in name:
- freq = b.count(word) #计算出现次数
- sheet.append([word,freq]) #把内容添加到sheet
- newlist.append([word,freq]) #把内容加入空列表
- newlist = sorted(newlist,key=lambda k:k[1],reverse=True) #给列表排序
- #用excel行数对比处理的数据,如果一样就说明全部数据已经处理完,如果不同,就说明有的数据没有处理
- if linesnum == x:
- print(f'数据处理完毕,共{linesnum}条记录')
- print(newlist)
- wb.save("积分明细.xlsx")
- else:
- print(f'共有数据{linesnum},已经处理{x}条,请排查数据')
复制代码 |
|