批处理-文件比较生成
项目中在图片资源文件对比中,以前是用的手动差分,可以通过批处理进行文件的自动差分,同样还可以给自动生成的文件命名或者其他。
以下是代码部分,可改进地方:
- 输入判断
- 输入采用文件输入方式,避免频繁的在命令中输入
- 输出文件log信息
- 错误处理
import os
import subprocess
inp_exe = ""
inp_a = ""
inp_b = ""
pic_out = ""
def BmpDiff(exefile,file_a,file_b,file_c):
'''
You can use:subprocess.Popen((exefile + " " + file_a + " " + file_b + " " + file_c))
But it show so many windows,you can set
subprocess.STARTUPINFO.dwFlags = subprocess.STARTF_USESHOWWINDOW
subprocess.STARTUPINFO.wShowWindow = subprocess.SW_HIDE
hide all windows.
'''
os.popen((exefile + " " + file_a + " " + file_b + " " + file_c))
def Cyc_Fold(Folder_In,Folder_Out):
#遍历当前文件夹
for i in os.listdir(Folder_In):
if os.path.isdir(os.path.join(Folder_In,i)):
os.mkdir(os.path.join(Folder_Out,i))
#print(os.path.join(Folder_Out,i))
Cyc_Fold(os.path.join(Folder_In,i),os.path.join(Folder_Out,i))
if os.path.isfile(os.path.join(Folder_In,i)) and i.endswith(".bmp"):
BmpDiff(inp_exe,inp_a,os.path.join(Folder_In,i),os.path.join(Folder_Out,i))
print(os.path.join(Folder_Out,i) + "-------> ok..")
print('''Read_Me:
1. Base图像必须为单个文件
2. 可处理单个生成和群生成
3. 输入资源为文件夹时,输出资源一定要也是文件夹!
''')
while not inp_exe.endswith(".exe"):
inp_exe = input("请正确输入bmpdiff.exe文件路径:")
while not inp_a.endswith(".bmp"):
inp_a = input("请正确输入Base图像(A.bmp)路径:")
inp_b = input("请输入资源图像文件夹名/文件名:")
pic_out = input("请输入输出图像名/文件夹名:")
if pic_out.endswith(".bmp") and inp_b.endswith(".bmp"):
BmpDiff(inp_exe,inp_a,inp_b,pic_out)
else:
if not os.path.exists(pic_out):
os.mkdir(pic_out)
Cyc_Fold(inp_b,pic_out)
对于在后台有一些列数据来说,如果知道当前文件与目标文件文件名之间的关系,那么可以直接省略掉这一步。
一般有两种方法:
- 在生成之初就做好匹配
- 在生成以后再批量转换
以下给出第一种方案,利用python字典,进行判断.
import os
import subprocess
dir_csv = {}
inp_exe = ""
inp_a = ""
inp_b = ""
pic_out = ""
def BmpDiff(exefile,file_a,file_b,file_c):
os.popen(" ".join([exefile,file_a,file_b,file_c]))
def Cyc_Fold(Folder_In,Folder_Out):
#遍历当前文件夹
for i in os.listdir(Folder_In):
if os.path.isdir(os.path.join(Folder_In,i)):
os.mkdir(os.path.join(Folder_Out,i))
#print(os.path.join(Folder_Out,i))
#文件夹的嵌套使用
Cyc_Fold(os.path.join(Folder_In,i),os.path.join(Folder_Out,i))
if os.path.isfile(os.path.join(Folder_In,i)) and i.endswith(".bmp"):
if i in dir_csv.keys():
BmpDiff(inp_exe,inp_a,os.path.join(Folder_In,i),os.path.join(Folder_Out,dir_csv[i]))
print(os.path.join(Folder_Out,i) + "-------> ok..")
else:
BmpDiff(inp_exe,inp_a,os.path.join(Folder_In,i),os.path.join(Folder_Out,i))
print(os.path.join(Folder_Out,i) + "-------> ok..")
csv_name = input("Please input csv file name:")
file_csv = open(csv_name,"r")
for i in file_csv:
dir_csv[i.split(",")[0]] = i.split(",")[1]
print('''Read_Me:
1. Base图像必须为单个文件
2. 可处理单个生成和群生成
3. 输入资源为文件夹时,输出资源一定要也是文件夹!
''')
while not inp_exe.endswith(".exe"):
inp_exe = input("请正确输入bmpdiff.exe文件路径:")
while not inp_a.endswith(".bmp"):
inp_a = input("请正确输入Base图像(A.bmp)路径:")
inp_b = input("请输入资源图像文件夹名/文件名:")
pic_out = input("请输入输出图像名/文件夹名:")
if pic_out.endswith(".bmp") and inp_b.endswith(".bmp"):
BmpDiff(inp_exe,inp_a,inp_b,pic_out)
else:
if not os.path.exists(pic_out):
os.mkdir(pic_out)
Cyc_Fold(inp_b,pic_out)