批处理-文件比较生成

项目中在图片资源文件对比中,以前是用的手动差分,可以通过批处理进行文件的自动差分,同样还可以给自动生成的文件命名或者其他。
以下是代码部分,可改进地方:

  1. 输入判断
  2. 输入采用文件输入方式,避免频繁的在命令中输入
  3. 输出文件log信息
  4. 错误处理
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)

对于在后台有一些列数据来说,如果知道当前文件与目标文件文件名之间的关系,那么可以直接省略掉这一步。
一般有两种方法:

  1. 在生成之初就做好匹配
  2. 在生成以后再批量转换

以下给出第一种方案,利用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)

原文地址:https://www.cnblogs.com/ply616/p/5858000.html