零. 目标
上一篇读取excel表格,生成批处理文件,手动把批处理文件复制进图片文件夹,并手动运行批处理文件,然后删除批处理文件。期间还有很多工作还是手动完成,所以本脚本除了前期的准备工作,包括把图片归类,把图片文件夹按照要求命名,之后就把所有工作交给python完成了。
一. 准备工作
文件夹要求
重要几点:
- 在PLAIN文件夹中有jpg和tif两种格式的图片。
- 图片的排列顺序不能变。
- 根文件夹下分若干个形体名文件夹,形体名下每个配色分两个文件夹,第一个是PLAIN文件夹,命名规则为PLAIN-形体名-配色名,第二个是SHADOW文件夹,命名规则为SHADOW-形体名-配色名。形体名和配色名一定要跟EXCEL表格里面的形体名和配色名一致,命名时不能有空格。
二.批处理文件
跟上一篇的不同之处在于,这次在PLAIN文件夹里同时有JPG和TIF文件,我们需要同时对两种图片进行命名。所以批处理文件需要对不同的图片进行判断。
@echo offset a=0setlocal EnableDelayedExpansionfor %%n in (.jpg) do (ren "%%n" "PLAIN_S760WX_010_0!a!.jpg"set /A a+=1)for %%n in (.tif) do (ren "%%n" "PLAIN_S760WX_010_0!a!.tif"set /A a+=1)
而在SHADOW文件夹里只需要对JPG进行判断:
@echo offset a=0setlocal EnableDelayedExpansionfor %%n in (*.jpg) do (ren "%%n" "SHADOW_S760WX_010_0!a!.jpg"set /A a+=1)
三.源代码
a. 生成批处理文件
import openpyxlwb = openpyxl.load_workbook('bat.xlsx')#读取Excel文件sh = wb.active #进入目标文件薄(c1, c2, c3, c4) = (6, 7, 8, 9)#需要读取的列for r in range(2, 142):#行的范围 vp = sh.cell(r, c1).value #读取第6列,从2行到最后一行并提出它的值,这是PLAIN的图片文件命名前缀 vnp = sh.cell(r, c3).value #读取第8列,从2行到最后一行并提出它的值,这是PLAIN的批处理文件命名前缀 fnp = '%s.bat' % vnp #得到批处理文件的全名 with open(fnp, 'w',encoding = 'UTF-8') as f1: #把批处理文件的内容写入批处理文件,批处理文件的相关内容见文章。 f1.write('@echo off\nset a=0\nsetlocal EnableDelayedExpansion\nfor %%%%n in (*.jpg) do (\nren "%%%%n" "%s!a!.jpg"\nset /A a+=1\n)\nfor %%%%n in (*.tif) do (\nren "%%%%n" "%s!a!.tif"\nset /A a+=1\n)' % (vp,vp)) break for R in range(2, 142): vs = sh.cell(R, c2).value vns = sh.cell(R, c4).value fns = '%s.bat' % vns with open(fns, 'w',encoding = 'UTF-8') as f2: f2.write('@echo off\nset a=0\nsetlocal EnableDelayedExpansion\nfor %%%%n in (*.jpg) do (\nren "%%%%n" "%s!a!.jpg"\nset /A a+=1\n)' % vs) break
b.自动运行批处理文件
import osimport shutila = 0rootpath = r'D:\BEARPAW\Strole\shooting\second\photos'#图片的根目录for i in os.walk(r'D:\SONIC\Python\batfiles'):#批处理文件根目录,遍历 files = i[2] #文件名组成的列表 for each in files:#迭代出批处理文件名 if '.bat' in each and 'M.bat' not in each:#筛选出批处理文件和暂时不用批处理文件 style = each.split('-')[1]#文件名分割出形体名文件夹的名字 folder = each.split('--S')[0]#文件名分割出形体名下配色的文件夹名称 picfolder = ''.join([rootpath,'\\',style, '\\',folder])#得到图片的上级目录的绝对路径 filepath = ''.join([picfolder, '\\', each])#得到我们需要复制批处理文件的目标文件 if os.path.exists(picfolder):#判断图片文件夹是否存在 shutil.copyfile(each, filepath)#由于目前的工作目录在此脚本所在位置,所以直接用批处理文件名。然后复制到目标文件上。用copyfile目标文件可以不存在 os.chdir(picfolder)#由于用python运行批处理文件,需要在当前目录,所以改变脚本工作目录到批处理文件的目标目录 os.system(each)#运行批处理文件 os.remove(filepath)#删除批处理文件 a += 1 为了记录处理的个数 print(a) os.chdir(r'D:\SONIC\Python\batfiles')#改变脚本工作目录到之前的原批处理文件根目录
四. 遇到的一些问题
- python在运行
os.system()
对批处理文件进行操作时,需要切换脚本的工作目录到批处理的文件夹中。否者不会有任何作用。在本脚本中运行完后,需要切换回去。 os.path.exists()
判断出错。之前收到一些通过QQ传过来的文件夹,不知道是什么原因,在我修改掉文件夹名后,它在系统中文件夹名仍然是旧的文件夹名,所以它的路径就出现问题。当把这个文件夹复制到其他位置时,它立刻变成旧的文件名。至今我仍然没有搞懂是什么原因,我只能手动把文件夹里面的图片剪切出来放进一个新的文件夹里,重新命名。如下图:这个文件我已经改名为1了,但是属性里面的名称还是以前的名称,路径后面的文件名还是以前的文件名
- 我们是根据批处理文件名才拆分出形体名和配色名,为了方便使用了
-
,而不是使用之前的_
,