Python办公自动化统计实例--毕业照编号统计

实例描述

一年一度毕业季,除开离别的不舍和四年大学时光的回忆,伴随而来的还有作为班委的无穷无尽的任务,班级里面各个同学的毕业照的套餐统计就是一项。

毕业照的套餐有四个,我们班一共拍了八张集体照,电子版的全发给同学们,不过照片塑装打印的服务需要收费,一共有四个套餐供大家选择,每个套餐对应相应的需要从八张照片中选择的张数。

|------|-----|-----|-----|-----|
| 套餐 | 套餐一 | 套餐二 | 套餐三 | 套餐五 |
| 数量/张 | 2 | 3 | 4 | 5 |

每张照片都会对应唯一的编号供每位同学确认挑选,如下图。

起初的解决思路就是直接用共享文档让大家填写就行,不过最后得到的结果是这样。。

图片编号那一列真的是不堪入目,有填写完整编号的,有只填写后三位数字的,且分隔符有使用'、',也有使用','的,任务的目标是以班级为单位将每个编号的照片汇总数量上报给摄影楼进行塑装,使用Excel的筛选功能还是需要人工进行最后的统计,显得繁琐。

脚本解决思路设计

可以使用python的pandas模块对这些信息进行统计。

首先把共享文档的内容导出为本地的Excel文件格式,同时把表格内容中的','统一替换成'、',方便后续的字符串分割;

首先是对文件的读取,这是直接使用pandas模块进行读取;

python 复制代码
import pandas as pd

file_path = r'D:\py-code\company\6_14_class\毕业照图片编号.xlsx'
data = pd.read_excel(file_path,keep_default_na=False)
photo_id_list = data['图片编号'] 

keep_default_na=False是表示读取的时候跳过存在空值的行,photo_id_list = data['图片编号'] 是读取'图片编号'作为表头的列的信息,返回的是列表结构;

接下来需要考虑的是解决图标编号标准不一的问题,这里是构建映射表,通过哈希表的结果实现,统一把所有的编号映射成完整的图片序号;

python 复制代码
true_list = ['519A0349','519A0351','519A0358','519A0416','519A0421','519A0424','519A0430','519A0437']
id_dict = {'349':'519A0349','351':'519A0351','358':'519A0358','416':'519A0416','421':'519A0421','424':'519A0424','430':'519A0430','437':'519A0437'}

true_list是所有八张图片的编号,防止同学在填写的时候出现错误(在检查过程中发现有两位同学的编号出现了错误,damn!)

python 复制代码
for single_id in photo_id_list: # 读取编号列的每一行的信息
    if single_id != '': # 跳过空值
        photo_id = single_id.split('、') # 以'、'作为分隔符号分隔获得多编号的信息
        if photo_id[0] in id_dict.keys(): # 检查是否是编码在后三位的简写
            photo_id_new = photo_id  # 复制原编码
            photo_id = [] # 清空原编码,准备下面的重新赋值
            for photo_id_single in photo_id_new:
                photo_id.append(id_dict[photo_id_single])  # 通过映射表复制新编码

图片的统计也是通过字典的方法进行最终的统计,主键是图片的编号,值是该图片对应的汇总张数;

python 复制代码
from collections import defaultdict

count_photo_id = defaultdict(int)
count_combine = defaultdict(int)


# 以下是伪代码

        for photo_id_single in photo_id:
            if photo_id_single not in true_list:  # 检查编号是否错误
                print('wrong id:',photo_id_single)
                # raise KeyError('something woring')

            else:
                count_photo_id[photo_id_single] +=1  # 图片编号作为主键的值加一
                n+=1 # 统计总的图片张数

对于套餐的统计使用count_combine字典完成,具体的方法与count_photo_id的统计相同,这里就不赘述了。

代码

python 复制代码
import pandas as pd
from collections import defaultdict

true_list = ['519A0349','519A0351','519A0358','519A0416','519A0421','519A0424','519A0430','519A0437']
id_dict = {'349':'519A0349','351':'519A0351','358':'519A0358','416':'519A0416','421':'519A0421','424':'519A0424','430':'519A0430','437':'519A0437'}

file_path = r'D:\py-code\company\6_14_class\毕业照图片编号.xlsx'

data = pd.read_excel(file_path,keep_default_na=False)

count_photo_id = defaultdict(int)
count_combine = defaultdict(int)

# data.fillna(0)
photo_id_list = data['图片编号'] 
n=0
for single_id in photo_id_list:
    if single_id != '':
        photo_id = single_id.split('、')
        if photo_id[0] in id_dict.keys():
            photo_id_new = photo_id
            photo_id = []
            for photo_id_single in photo_id_new:
                photo_id.append(id_dict[photo_id_single])
        # print(photo_id)

        # chenk
        for photo_id_single in photo_id:
            if photo_id_single not in true_list:
                print('wrong id:',photo_id_single)
                # raise KeyError('something woring')

            else:
                count_photo_id[photo_id_single] +=1
                n+=1

print('\n')	
print("图片统计:\n", count_photo_id)
print('all number:',n)

combine_infor = data['套餐']
for combine in combine_infor:
    if combine != "":
        count_combine[combine] += 1

print('\n')
print('套餐统计:', count_combine)

最后得到的结果:

ok,完成统计。

总结

好吧我承认上面的脚本其实都可以通过Excel的功能完成,但对于大学生活最后的几项任务,我还是想增加一些技术含量,以致敬即将结束的校园生活。

毕业快乐~


相关推荐
qq_529025294 分钟前
Torch.gather
python·深度学习·机器学习
数据小爬虫@4 分钟前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
ZJ_.6 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
Narutolxy11 分钟前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader19 分钟前
全面解析 Golang Gin 框架
开发语言·golang·gin
禁默30 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood36 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑39 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
終不似少年遊*42 分钟前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
程序猿进阶42 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot