昨天收到文件要处理对班级内量化分数进行统计,原始数据为一长串人名,我需要按照每人的出现次数为其加上对应分数,每人次0.1分。
总共五天的数据,每天都有上百人次,一个个统计绝对会把我逼疯,于是我想到是否可以使用工具对其进行自动化处理。恰巧,我又会一点python.
原始数据就是一长串人名,每两个之间用空格隔开,几个空格说不准。
于是我有了大致思路:
1.处理得到原始数据中每个人的出现次数并将其一一对应(字典键值对)
2.获得excel中每人所加分应该对应的位置
3.将每人所得分数填入对应的位置
原始数据的处理
因为每两人名字之间都有空格(都在同一行),所以我用split将其用空格分隔并制成列表,接着使用for循环,遍历列表得到键值对(名称--出现次数),最后使用del删去字典中key为' '(空格)的键值对,代码如下:
# 输入
names = input()
# 将原始数据制成列表,以空格为分割
name_list = names.split(' ')
# 定义空字典用于储存处理后的数据
name_grade = {}
# 遍历name_list,将每人的名称作为key,出现次数为值
for key in name_list:
name_grade[key] = name_grade.get(key, 0) + 1 # 每检测到一个名称,则为其所对值+1
# 删去为空的key
if ' ' in name_grade:
del name_grade['']
读取execl,获取所需更改的位置并更改数据
在这里我使用了openpyxl来处理xlsx文档,所以首先引入openpyxl
import openpyxl
我要在每位同学及日期所对应的位置填写分数,所以我首先要获取对应同学的行号以及对应日期的列号,由于只有5天所以我没有做日期列号的查找而是选择手动更改,只需要在每次处理前将ws.cell()中的column的值改为对应行号即可
# 打开excel
df = openpyxl.load_workbook('lis.xlsx')
ws = df['Sheet1']
# 遍历name_grade获取每人名称
for nam in name_grade:
sheet = df.active
# 获取每人对应的位置
for roc in sheet.iter_rows():
for cell in roc:
if cell.value == nam:
# 只保留行号,因为上面所得的位置是'字母(列)+数字(行)的'格式,所以只需保留数字即可
row = int(re.sub(u"([^\u0030-\u0039\u002e\uffe5])", "", cell.coordinate))
# 每人次0.1分,所以除以十
fs = name_grade[nam]/10
# 记得改列
ws.cell(row=row, column=16).value = fs
# 在同一行输出人名和所加分,方便了解程序进程
print(nam, end=' ')
print(fs)
# 保存
df.save('lis.xlsx')
当然其中对数据处理时也使用了re正则表达式,所以也要引入re
import re
完整代码
import re
import openpyxl
# 输入
names = input()
# 将原始数据制成列表,以空格为分割
name_list = names.split(' ')
# 定义空字典用于储存处理后的数据
name_grade = {}
# 遍历name_list,将每人的名称作为key,出现次数为值
for key in name_list:
name_grade[key] = name_grade.get(key, 0) + 1
# 删去为空的key
if ' ' in name_grade:
del name_grade['']
# 打开excel
df = openpyxl.load_workbook('lis.xlsx')
ws = df['Sheet1']
# 遍历name_grade获取每人名称
for nam in name_grade:
sheet = df.active
# 获取每人对应的位置
for roc in sheet.iter_rows():
for cell in roc:
if cell.value == nam:
# 只保留行号,因为上面所得的位置是'字母(列)+数字(行)的'格式,所以只需保留数字即可
row = int(re.sub(u"([^\u0030-\u0039\u002e\uffe5])", "", cell.coordinate))
# 每人次0.1分,所以除以十
fs = name_grade[nam]/10
# 记得改列
ws.cell(row=row, column=16).value = fs
# 在同一行输出人名和所加分,方便了解程序进程
print(nam, end=' ')
print(fs)
# 保存
df.save('lis.xlsx')