Python办公自动化实例--照片挑选

实例背景

学院举行毕业晚会,要制作照片墙,让学生自己上传一直没有多少回应,上传的没有几张(学院的号召力是真的拉),需要从整个学校的学生证件照中挑选出外面学院的同学,于是这个"艰巨"的任务就落到了我这个牛马身上。。

由于证件照涉及个人的信息这里就不贴出来了,我拥有的材料:这个学校今年毕业的所有同学的证件照,我们学院的学生名单Excel,如下图:

每张图片的命名包含学生的姓名,任务的目标是通过学生的名单从整个学校的照片中挑选出我们学院的学生的照片到另一个文件夹中。

解决思路

辅导员让我根据名单中的名字从整个学校的照片中一个一个剪切粘贴到另一个文件夹,从八千多的照片中挑选出三百多张学生的照片,真正的牛马产生了!(最后照片墙的制作致谢中也没有写我的名字)不过幸好可以写脚本,半个小时就能解决。

通过pandas读取我们学院每个同学的名字,再根据名字确认照片,然后在把它转移到目标的文件夹中,即可解决问题。

图片的命名格式:

xxx(姓名)-xxxxxxxxxxxxxxxx(编号)

可以对'-'使用split进行分割,返回列表后去下标为0的内容即可获得学生姓名。

代码

python 复制代码
import os
import shutil
import pandas as pd

photo_path = r'D:\py-code\company\6_11_campus\五山校区'
data_path = r'D:\py-code\company\6_11_campus\name.xlsx'

photo_student_name = []
name_namefile = {}

photo_list_file_name = sorted(os.listdir(photo_path))
for single_name in photo_list_file_name:
    photo_student_name.append(single_name.split('-')[0])
    name_namefile[single_name.split('-')[0]] = single_name

# print(len(photo_list_file_name))
# print(photo_student_name)

# print(name_namefile)
data = pd.read_excel(data_path)

au_names = data['姓名']

# 多重循环,时间复杂度高
# for name in au_names:
#     for k,v in name_namefile.items():
#         if name == k:
#             shutil.move(os.path.join(r'D:\py-code\company\6_11_campus\五山校区',v),os.path.join(r'D:\py-code\company\6_11_campus\auto',v))
    
for name in au_names:
    if name in name_namefile.keys():
        namefile = name_namefile[name]
        shutil.move(os.path.join(r'D:\py-code\company\6_11_campus\五山校区',namefile),os.path.join(r'D:\py-code\company\6_11_campus\auto',namefile))

print('done')

检查

我们学院有312个学生,但最后挑选出来只有302个,又写了一个脚本进行check

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

photo_path = r'D:\py-code\company\6_11_campus\五山校区'
data_path = r'D:\py-code\company\6_11_campus\name.xlsx'

photo_student_name = []
name_namefile = defaultdict(str)

photo_list_file_name = sorted(os.listdir(photo_path))
all_name_list = []
# print(photo_list_file_name)
n=0
for single_name in photo_list_file_name:
    photo_student_name.append(single_name.split('-')[0])
    if single_name.split('-')[0] not in name_namefile:
        name_namefile[single_name.split('-')[0]] = single_name
        all_name_list.append(single_name.split('-')[0])
    else:
        # print('重复')
        # print(single_name)
        n+=1
print(n)
# print(len(photo_list_file_name))
# print(photo_student_name)


print(len(name_namefile))
data = pd.read_excel(data_path)

au_names = data['姓名']
# print(len(au_names))

for au_name in au_names:
    if au_name not in all_name_list:
        print(au_name)

发现整个学校有24个重名的,不过不是这个错误,最后的是发现有10个同学没有在学校的照片中,辅导员说不管了,真的是办事效率高的辅导员老师!

欢迎大家讨论交流~


相关推荐
88号技师15 分钟前
2026年2月一区SCI-交叉传播优化算法Propagation Alongside Crossover-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
A.零点20 分钟前
【2个月 C 语言从入门到精通:零基础系统教程】第十二讲:深入了解指针(五)
c语言·开发语言·网络·笔记·visual studio
飞天狗11130 分钟前
零基础JavaWeb入门——第五课第一小节:九大内置对象 · 第1个:request(请求对象)
java·开发语言·前端·后端·servlet
z落落30 分钟前
C#ToolStrip+StatusStrip 状态栏实时显示系统时间+NotifyIcon系统托盘
开发语言·c#
插件开发41 分钟前
vs2015 cuda c++ 线程号的计算详解
开发语言·c++·算法
石山代码41 分钟前
变量与解构
开发语言·前端·javascript
c++之路1 小时前
Bazel C++ 构建系列文档(五):多目标与多包项目
java·开发语言·c++
Hello:CodeWorld1 小时前
【C++ 避坑指南】告别缓冲区溢出!全面解析 std::snprintf 的安全美学与核心陷阱
开发语言·c++·安全
凡人叶枫1 小时前
Effective C++ 条款38:通过复合塑模出 has-a 或 \“根据某物实现出\
linux·开发语言·c++·windows
MemoriKu1 小时前
Flutter 本地 AI 相册工程收口:从屏幕常亮、标签体系到照片属性后台队列
大数据·人工智能·python·flutter·elasticsearch·搜索引擎·数据库架构