Python 批量处理大学校运会报名 Excel 表格,多表整合、数据汇总及统计 实例

前言:

上一篇博客,介绍了一个简单的实例:给已有Excel表格添加序号、增加新列,主要是介绍 xlrd 与 xlwt 两个模块是如何在一起工作的。

这一篇我们来介绍另外一个实例,相对来说会复杂与贴近日常工作一点。

需求:

假设:需完成一份报名工作,将已做好报名表下发到各个报名单位。他们按格式填好报名表、上交,最后由你负责信息汇总和统计。

这样一份任务其实比较简单、常见,但当报名单位众多,如有几千份报名表需要统计时,个人操作起来还是很费时费力的,也可能会出现信息统计错误的情况。

模拟的具体案例:完成校运会报名表汇总、统计工作。

假设每个班级按校运会报名表填写了该班级的学生报名信息,需要你汇总、统计成一张Excel表格。

Excel表格 汇总信息 sheet 里包含所有学生的报名信息,其他sheet表 是每个校运会运动项目学生的报名信息表。

单个的报名表截图如下:

在这里插入图片描述
作为试验,我们做了五个Excel表格,放在了项目文件下的 tables 文件夹:

在这里插入图片描述
注:Excel文件名无所谓(最好不要有中文和特殊字符)。

我们希望做成的汇总数据表如下:

在这里插入图片描述

主要思路及实现代码:
1、先获取目标文件路径下的所有Excel文件:

这里用的是 os 模块的 walk 方法来获取:

# 先遍历目录下文件
path = './tables' # 此处用的是相对路径(如自己试验,需注意自己的文件路径)
f = os.walk(path)
files = []  # xls 文件列表
# 获取目录下文件
for dir_path, dir_names, file_names in f:
    for file in file_names:
        # 筛选目录下xls格式文件
        if '.xls' in file:
            files.append(file)

print(files) # 测试获取的文件
# 打印结果:
# ['5.xls', '1.xls', '2.xls', '3.xls', '4.xls']

经过上面的代码,我们已经获取到了我们想要的Excel表格文件。

2、读取所有Excel表格数据:

分析: 因为我们要读取多个文件数据,每个文件的数据结构比较一致,后期还要进行数据汇总与统计工作。
所以在前期选好一个 数据结构来存储数据 ,是非常重要的。这里决定先设计一个包含列表的列表来存储数据,数据结构示意:
[[[第一行数据:学院班级信息],[第二行数据: 报名信息字段], [第三行数据:报名信息]…], [第二个表数据],[],…]

这里不用字典结构来存储数据,是为了后期统计数据方便。如果按照逻辑来说,用字典的键对应文件名或学院班级信息,值对应该班级报名信息更合理些。

读取数据也比较关键,先定义了一个读取单个表格数据的函数:

# 定义读取单个 excel 文件数据
def read_excel(name):
    file_path = path + '/'+ name
    work_book = xlrd.open_workbook(file_path)
    sheet = work_book.sheet_by_index(0)
    return sheet._cell_values[1:]

# 测试一下:
print(read_excel(files[0]))
# ------运行结果------
# [['学院:', '机械学院', '', '年级:', 2015.0, '专业:', '模具设计', ''], 
# ['姓名', '学号', '性别', '年龄', '参赛项目', '是否参加往届过校运会', '能否参加集训', '联系方式'], 
# ['阮小二', 150914031.0, '男', 23.0, '10000米', '否', '能', 15854441586.0], 
# ['阮小五', 150914025.0, '男', 21.0, '400米', '否', '能', 17054661590.0], 
# ['阮小七', 150914010.0, '男', 22.0, '1000米', '否', '能', 18953000549.0],
# ...
# ------运行结果------

可以看到,写的方法可以成功的读取到单个表格的数据(忽略数据内容…,人名太难想了…)。

有了这个方法读取所有表格的数据就很简单了,这里用的是列表推导式:

# 读取目录下所有数据
sign_data = [read_excel(name) for name in files]
print(sign_data)  # 测试读取到的所有数据
# ------运行结果------
# [[['学院:', '机械学院', '', '年级:', 2015.0, '专业:', '模具设计', ''], 
# ['姓名', '学号', '性别', '年龄', '参赛项目', '是否参加往届过校运会', '能否参加集训', '联系方式'], 
# ['阮小二', 150914031.0, '男', 23.0, '10000米', '否', '能', 15854441586.0], 
# ['阮小五', 150914025.0, '男', 21.0, '400米', '否', '能', 17054661590.0], 
# ['阮小七', 15091401
  • 13
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值