一、问题描述
新学期,高二年级学生重新分班。高一照片文件夹下面有500多张以学生姓名命名的jpg格式的学生照片,由于学生重新分班,需要把学生的照片根据Excel表的班级重新分配。比如标记为二(1)班的要放在名为1的文件夹里,其它的类推。Excel表的内容如下:
Excel的班级和学生姓名
二、问题分析
如果是手工操作,要一个一个搜人的姓名,然后放进不同的文件夹里,非常的麻烦,还容易出错,即使多人同时进行,也要花三四个小时,现在用python五秒就搞成了。实现的步骤如下所示:
- 导入python模块os, shutil,openpyxl
- 读取姓名.xlsx这个Excel表,由于没有重复的学生姓名,所以以学生名为键,以学生所在的班级为值,生成一个字典。
- 然后,遍历高一照片这个文件夹,获取学生姓名,根据班级名来创建文件夹,然后根据学生姓名来查询其所在的班级,从而构造其存贮的路径,最后用shutil.copy把图片拷贝到指定的路径。
三、实现的代码
最终现实的代码如下,亲测5秒钟搞定五百多张照片。
import os
import shutil
from openpyxl import load_workbook
# 读取姓名.xlsx文件
workbook = load_workbook('姓名.xlsx')
sheet = workbook.active
# 获取所有学生姓名和班级信息
student_info = {}
for row in sheet.iter_rows(min_row=2, values_only=True): # 假设第一行是标题
class_info, name = row
class_info = class_info.strip() # 去除班级信息的空格
name = name.strip() # 去除姓名的空格
student_info[name] = class_info
# 遍历高一照片文件夹
photo_dir = '高一照片'
for photo in os.listdir(photo_dir):
if photo.endswith('.jpg'):
# 提取照片名(假设照片名是学生姓名)
student_name = os.path.splitext(photo)[0]
# 查找学生的班级信息
if student_name in student_info:
student_class = student_info[student_name]
# 提取班级编号
class_number = student_class.split('(')[1].split(')')[0]
class_dir = os.path.join('.', class_number)
# 创建对应的班级文件夹(如不存在)
if not os.path.exists(class_dir):
os.makedirs(class_dir)
# 复制照片到对应的班级文件夹
src = os.path.join(photo_dir, photo)
dst = os.path.join(class_dir, photo)
shutil.copy(src, dst)
print(f"已将照片 {photo} 复制到 {class_number} 文件夹")
else:
print(f"找不到照片 {photo} 对应的学生信息")
print("所有照片已处理完毕")
四、学后总结
撰写以上代码时,我借助了人工智能工具。在对问题描述时,我还把数据进行规整,删除了用不到的数据,调整了格式,还更换了pandas为openpyxl,这样更便于理解。
对于操作的数据,我还进行了备份,防止在测试程序时误删图片。
最后,经过三四次的路径修改和运行测试,终于测试成功。