需求:
同事收到一张excel表格,一列是产品型号,一列是产品图片,长这样:
同事需要以产品型号名,来建立文件夹,然后把对应图片复制粘贴进去。看到表格有一百多列,同事直接就不想搞了,于是请我帮忙,想着能不能写个脚本自动化操作一下。
思路:
我们可以使用python来遍历这个excel表格,第一列作为文件夹的名字新建文件夹,然后读取图片数据,然后对应文件夹里面,即可。
说干就干:
先下载相关的库文件:
pip install pandas
pip install openpyxl
pip install Pillow
一顿操作猛如虎:
import pandas as pd
import os
from shutil import copyfile
# 读取Excel表格
excel_path = 'abc.xlsx'
df = pd.read_excel(excel_path)
# 新建文件夹
output_folder = 'output'
os.makedirs(output_folder, exist_ok=True)
# 遍历每一行,根据文件名创建子文件夹,并复制图片到子文件夹
for index, row in df.iterrows():
file_name = row['产品SKU代码']
image_path = row['图片URL']
# 创建子文件夹
subfolder_path = os.path.join(output_folder, file_name)
os.makedirs(subfolder_path, exist_ok=True)
# 复制图片到子文件夹
image_name = os.path.basename(image_path)
new_image_path = os.path.join(subfolder_path, image_name)
copyfile(image_path, new_image_path)
print(index)
print("操作完成,子文件夹已创建并图片已复制。")
信心满满,点击运行:
报错了,看信息发现,是没有正确拿到图片。仅生成了一个文件夹就戛然而止了,而且是空的:
仔细研究后发现,是因为我们excel中的图片,并不是以下载路径的形式保存在表格中,而是使用了WPS中的DISPIMG
函数,该函数以某种方式,把图片文件在excel文件内部封装保存起来,所以刚才没有读取到文件。
于是我将图片全部选中,转换为浮动图片:
excel中并不是图片的下载路径,而是直接是图片文件了,所以要改动一下python代码。
two thousand years later:
import pandas as pd
import os
import openpyxl as opx
# 读取Excel表格
excel_path = 'abc.xlsx'
df = pd.read_excel(excel_path)
# 新建文件夹
output_folder = 'output'
os.makedirs(output_folder, exist_ok=True)
# 遍历每一行,根据文件名创建子文件夹,并复制图片到子文件夹
for index, row in df.iterrows():
file_name = row['产品SKU代码']
# image_path = row['图片URL']
# 创建子文件夹
subfolder_path = os.path.join(output_folder, file_name)
os.makedirs(subfolder_path, exist_ok=True)
# print(subfolder_path ,"-->" ,index ,"-->" ,row)
print(index ,"-->" ,file_name)
# 复制图片到子文件夹
wb = opx.load_workbook('abc.xlsx')
ws = wb.active # 当前工作表
ws._images[index] # 图片对象
data = ws._images[index]._data() # 图片的字节数据
with open(subfolder_path + "/" + "image.png", "wb") as img:
img.write(data)
print("操作完成,子文件夹已创建并图片已复制。")
然后点击运行:
运行结果:
运行成功了,打开文件夹看一看,已经生成了若干个文件夹,并且里面有图片文件:
至此,成功解决了同事的烦恼。