python对excel的简单处理【加分统计】

        昨天收到文件要处理对班级内量化分数进行统计,原始数据为一长串人名,我需要按照每人的出现次数为其加上对应分数,每人次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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值