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的功能完成,但对于大学生活最后的几项任务,我还是想增加一些技术含量,以致敬即将结束的校园生活。

毕业快乐~


相关推荐
hudd6684 分钟前
JavaEE 初阶 - 多线程(初阶)
java·开发语言·java-ee
I Am a robert girl14 分钟前
稀有事件估计的迭代去对齐:从源码视角拆解重要性采样新范式
开发语言·python·机器学习·重要性采样·蒙特卡洛方法·稀有事件估计
天若有情67318 分钟前
开源|Comfort Lang v1.0.1,一款主打清爽交互的新型命令式编程语言
python·开源·交互·编程语言·项目分享·repl·comfort lang
golang学习记34 分钟前
rust开发,选VS Code还是RustRover?
开发语言·后端·rust
打工仔折腾 AI1 小时前
System Prompt 替代 Few-shot:用规则约束大模型输出的省钱实践
java·人工智能·python·spring·langchain·prompt·ai agent 实战
打工仔折腾 AI1 小时前
从零写一个CAD 05:以鼠标为中心的滚轮缩放,招法能复用但顺序不能反
开发语言·后端·python·性能优化·计算机外设·swift·ai agent 实战
CarIise1 小时前
Java实训阶段查漏补缺复习笔记1
java·开发语言·笔记
事圆则缓1 小时前
Kotlin 泛型方差实战:out、in、星投影与类型擦除
android·开发语言·kotlin
for_ever_love__1 小时前
控制流——if、for、while 与可迭代对象
python·大模型开发·循环·控制流
for_ever_love__1 小时前
PyTorch 张量与 autograd——自动求导怎么工作
pytorch·python·深度学习·自动求导