【Lab】Python改bat文件

给出一个特定的树形结构,每一层的数字依次递增后,按照从上到下,同时从左到右这样的顺序生成。这么说还是不太明白,比如下面这个简单的树形结构。

按照顺序应该写成这样[3_0, 3_4, 4_1, 4_2]

对应的bat文件内容是这样的。

%%%%%%%%%%%%%%%%[3_0]%%%%%%%%%%%%%%%%
totalLMH2               F:\xdm\test\mainBuilding3\case2\new\[3].jpg    F:\xdm\test\mainBuilding3\case2\new\[0].jpg      F:\xdm\test\mainBuilding3\case2\new\single\QP32\
removeRepeatedCoors     F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
dTAndHP2_1              F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
EnergyOpti_11           F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
perspectiveTAndLumaT    F:\xdm\test\mainBuilding3\case2\new\    F:\xdm\test\mainBuilding3\case2\new\single\QP32\    [3] [0]
jpgToYUV                F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\    F:\xdm\test\mainBuilding3\case2\new\single\QP32\bat\photometricTransfImageYUV\
combine5frames          F:\xdm\test\mainBuilding3\case2\new\yuv\[3].yuv   F:\xdm\test\mainBuilding3\case2\new\yuv\[0].yuv  F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\fiveFramesForHEVCCoding.yuv
HEVC_5Frames         -c QP32_01.cfg -c testPaper.cfg   -i F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\fiveFramesForHEVCCoding.yuv -o F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\recYUV\rec[3_0].yuv > F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\result\result[3_0].txt

%%%%%%%%%%%%%%%%[3]%%%%%%%%%%%%%%%%
HEVC_5Frames        -c  QP32_01.cfg -c testPaper.cfg  -i F:\xdm\test\mainBuilding3\case2\new\yuv\[3].yuv -o F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\recYUV\rec[3].yuv > F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\result\result[3].txt

%%%%%%%%%%%%%%%%3_4%%%%%%%%%%%%%%%%
totalLMH2               F:\xdm\test\mainBuilding3\case2\new\3.jpg    F:\xdm\test\mainBuilding3\case2\new\4.jpg      F:\xdm\test\mainBuilding3\case2\new\single\QP32\
removeRepeatedCoors     F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
dTAndHP2_1              F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
EnergyOpti_11           F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
perspectiveTAndLumaT    F:\xdm\test\mainBuilding3\case2\new\    F:\xdm\test\mainBuilding3\case2\new\single\QP32\    3   4
jpgToYUV                F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\    F:\xdm\test\mainBuilding3\case2\new\single\QP32\bat\photometricTransfImageYUV\
combine5frames          F:\xdm\test\mainBuilding3\case2\new\yuv\3.yuv   F:\xdm\test\mainBuilding3\case2\new\yuv\4.yuv  F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\fiveFramesForHEVCCoding.yuv
HEVC_5Frames         -c QP32_02.cfg -c testPaper.cfg   -i F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\fiveFramesForHEVCCoding.yuv -o F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\recYUV\rec3_4.yuv > F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\result\result3_4.txt

%%%%%%%%%%%%%%%%4_1%%%%%%%%%%%%%%%%
totalLMH2               F:\xdm\test\mainBuilding3\case2\new\4.jpg    F:\xdm\test\mainBuilding3\case2\new\1.jpg      F:\xdm\test\mainBuilding3\case2\new\single\QP32\
removeRepeatedCoors     F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
dTAndHP2_1              F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
EnergyOpti_11           F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
perspectiveTAndLumaT    F:\xdm\test\mainBuilding3\case2\new\    F:\xdm\test\mainBuilding3\case2\new\single\QP32\    4   1
jpgToYUV                F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\    F:\xdm\test\mainBuilding3\case2\new\single\QP32\bat\photometricTransfImageYUV\
combine5frames          F:\xdm\test\mainBuilding3\case2\new\yuv\4.yuv   F:\xdm\test\mainBuilding3\case2\new\yuv\1.yuv  F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\fiveFramesForHEVCCoding.yuv
HEVC_5Frames         -c QP32_02.cfg -c testPaper.cfg   -i F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\fiveFramesForHEVCCoding.yuv -o F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\recYUV\rec4_1.yuv > F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\result\result4_1.txt

%%%%%%%%%%%%%%%%4_2%%%%%%%%%%%%%%%%
totalLMH2               F:\xdm\test\mainBuilding3\case2\new\4.jpg    F:\xdm\test\mainBuilding3\case2\new\2.jpg      F:\xdm\test\mainBuilding3\case2\new\single\QP32\
removeRepeatedCoors     F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
dTAndHP2_1              F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
EnergyOpti_11           F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\
perspectiveTAndLumaT    F:\xdm\test\mainBuilding3\case2\new\    F:\xdm\test\mainBuilding3\case2\new\single\QP32\    4   2
jpgToYUV                F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\    F:\xdm\test\mainBuilding3\case2\new\single\QP32\bat\photometricTransfImageYUV\
combine5frames          F:\xdm\test\mainBuilding3\case2\new\yuv\4.yuv   F:\xdm\test\mainBuilding3\case2\new\yuv\2.yuv  F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\fiveFramesForHEVCCoding.yuv
HEVC_5Frames         -c QP32_03.cfg -c testPaper.cfg   -i F:\xdm\test\mainBuilding3\case2\new\single\QP32\LMH\fiveFramesForHEVCCoding.yuv -o F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\recYUV\rec4_2.yuv > F:\xdm\test\mainBuilding3\case2\new\single\QP32\PWW\result\result4_2.txt

其中被 []括起来的是主要需要修改的地方,第二部分很简单,是根节点(这里是3)。内容结构与其余有点不一样,需要单独处理。

通过观察发现,实际上需要改的地方几乎使用第一行%%%%%%%%%%%%%%%%[\d+_\d+]%%%%%%%%%%%%%%%%里面括起来的编号。处理好其中一部分,其他的for循环就能搞定。写两个函数,一个单独处理根节点部分,另一个处理剩下的部分。

会用到了一个lab_node.bat的模板文件,内容和上面编好的bat几乎一样,读取这个bat文件,用新的数据替换相应部分就好了。共有30部分,若提供的树形结构复杂,超过了30部分,需要自己补充,注意保持QPXX_XX.cfg保持1234的顺序

lab_node.bat文件地址

上面的修改好后,就剩下全局修改了。因为路径不会是\mainBuilding3\case2\new\,得看具体需求,另外case是多图像才有的。最后的最后,将文件里面的QP32替换成QP27QP22生成两个副本。在程序中我使用了w+模式(可读写)打开文件,每次读后需要写或者写后需要读,都需要使用seek(0)将指针定位到文本开头。

这样下来,运行程序就会同时生成三个bat文件了。

import re

# 若树的路径数大于30,请到lab_node.bat增加一些部分。
# 注意每部分的最后一行,QPXX_XX.cfg保持1234的顺序
# 1.从上到下、从左到右,根据排序后的树形图依次填入
l = ('7_9', '7_13', '9_14', '13_3', '13_4', '13_5', '13_6',
     '13_10', '13_11', '13_12', '13_15', '13_16', '13_17')

# 2.填写方法名,层数, reference,多图像的时候填入case
# 单图像路径大概是这样xdm\test\patheon\reference1\
# 多图像路径大概是xdm\test\patheon\case2\reference1\
method, layer, refer, case = 'patheon', '3', 'reference2', ''

# 单图像
if not case:
    file_name = method + '_' + layer + refer + '_'
# 多图像
else:
    file_name = file_name = method + '_' + layer + case + '_' + refer + '_'

def check():
    if len(l) > 30:
        raise Exception('路径数超过30!请到模板文件lab_node.bat下添加缺少的部分')

def split_to_frames():
    """
    输入模板文件,分割成若干部分并返回
    :return: 分割好的部分的列表
    """
    # 输入文件
    with open('lab_node.bat', encoding='utf-8') as f:
        # 读取全部内容
        text_plain = f.read()

        # 分成结构相似的多个部分, DOTALL模式'.'匹配任意,包括换行符
        each_frame_p = re.compile(r'%+\d+.*?%+.*?HEVC_5Frames.*?txt', flags=re.DOTALL)
        frames = re.findall(each_frame_p, text_plain)
        return frames

def modify_frame(out_bat, path, frame):
    """
    处理非根节点部分
    :param out_bat: 输出文件
    :param path: 树的路径
    :param frame: 每一部分
    """
    # 处理每个frame的第一行%%%
    line0_p = re.compile(r'%+\d+_\d+%+')
    modify0 = re.sub(line0_p, '%' * 16 + path + '%' * 16, frame)
    # 处理totalLMH2那行,只有该行带有 数字.jpg, 且有两个
    jpg1_p = re.compile(r'totalLMH2.*?\d+.jpg')
    jpg2_p = re.compile(r'jpg.*?\d+.jpg')

    # 第一个数字
    modify1 = re.sub(jpg1_p, r'totalLMH2                F:\\xdm\\test\\mainBuilding3\\new\\'
                     + path.split('_')[0] + '.jpg', modify0)
    # 第二个数字
    modify2 = re.sub(jpg2_p, r'jpg    F:\\xdm\\test\\mainBuilding3\\new\\' + path.split('_')[1] + '.jpg', modify1)
    # .*?为懒惰模式,匹配成功第一个就停止匹配
    # 替换perspectiveTAndLumaT这行末尾的两个数字
    line6_p = re.compile(r'perspectiveTAndLumaT.*?QP\d+\\\s*\d+\s*\d+')
    modify3 = re.sub(line6_p, r'perspectiveTAndLumaT    '
                              r'F:\\xdm\\test\\mainBuilding3\\new\\ '
                              r'F:\\xdm\\test\\mainBuilding3\\new\\single\\QP32\\   ' + path.split('_')[0]
                     + r'   ' + path.split('_')[1],
                     modify2)

    # 替换'.yuv',共3个带数字
    yuv1_p = re.compile(r'frames.*?YUV\\\d+.yuv')
    yuv2_p = re.compile(r'yuv\\\d+.yuv\s*F.*?QP')
    yuv3_p = re.compile(r'-o F.*?rec\d+_\d+')
    modify4 = re.sub(yuv1_p,
                     r'frames           F:\\xdm\\test\\mainBuilding3\\new\\yuv\\' + path.split('_')[0] + '.yuv',
                     modify3)
    modify5 = re.sub(yuv2_p, r'yuv\\' + path.split('_')[0]
                     + r'.yuv   F:\\xdm\\test\\mainBuilding3\\new\\yuv\\' + path.split('_')[1] +
                     r'.yuv  F:\\xdm\\test\\mainBuilding3\\new\\single\\QP', modify4)
    modify6 = re.sub(yuv3_p, r'-o F:\\xdm\\test\\mainBuilding3\\new\\single\\QP32\\PWW\\recYUV\\rec' + path, modify5)
    # 替换'.txt', 共1个带数字
    txt_p = re.findall(r'\d+_\d+.txt', modify6)[0]
    modify7 = re.sub(txt_p, path + '.txt', modify6)
    out_bat.write(modify7 + '\n\n')

def modify_root_frame(out_bat, node, frame1):
    """
    处理根节点部分
    :param out_bat: 输出文件
    :param node: 根节点
    :param frame1: 第一部分
    """
    # 处理每个frame的第一行%%%
    line0_p = re.compile(r'%+\d+%+')
    modify0 = re.sub(line0_p, '%' * 16 + node + '%' * 16, frame1)
    # 替换yuv,共两个,是一样的,选第一个就行
    yuv_p = re.findall(r'\d+.yuv', modify0)[0]
    modify1 = re.sub(yuv_p, node + '.yuv', modify0)
    # 替换txt,共一个
    txt_p = re.findall(r'\d+.txt', modify1)[0]
    modify2 = re.sub(txt_p, node + '.txt', modify1)
    out_bat.write(modify2 + '\n\n')

def replace_all(out_bat):
    """
    替换掉模板文件的路径为当前指定
    :param out_bat: 输出文件
    """
    # 指针在文本末,直接read为空,需要定位到文本开始
    out_bat.seek(0)
    text = out_bat.read()
    # 单图像
    if not case:
        text = re.sub(r'mainBuilding3\\new', method + r'\\' + layer + refer, text)
    # 多图像
    else:
        text = re.sub(r'mainBuilding3\\new', method + r'\\' + case + r'\\' + layer + refer, text)

    # 替换后需要重新写入,由于上面进行过读操作,再将指针指向文本开头,覆盖
    out_bat.seek(0)
    out_bat.write(text)

def create_other_qp(out_bat):
    """
    将QP32替换成QP27和QP22
    :param out_bat: QP32的输出文件
    """
    other_qps = ('27', '22')
    # 刚才覆写了,所以定位到文本开头才能读到
    out_bat.seek(0)
    text = out_bat.read()
    for qp in other_qps:
        with open(file_name + qp + '.bat', 'w', encoding='utf-8') as f:
            new_qp_text = re.sub('QP32', 'QP' + qp, text)
            f.write(new_qp_text)

def run():
    # 检查路径数是否超过30
    check()
    # 第一部分
    first_path = l[0]
    # 根节点
    root = first_path.split('_')[0]
    # 获得所有部分
    frames = split_to_frames()
    with open(file_name + '32.bat', 'w+', encoding='utf-8') as f:
        # 1. 处理第一部分
        modify_frame(f, first_path, frames[0])
        # 2. 再处理根节点部分(第二部分)
        modify_root_frame(f, root, frames[1])
        # 3. 处理余下部分
        # l的index,第一部分处理过了,所以从1开始.
        i = 1
        for frame in frames[2:len(l) + 1]:
            modify_frame(f, l[i], frame)
            i += 1

        # 在全文进行替换
        replace_all(f)
        create_other_qp(f)

if __name__ == '__main__':
    run()

虽然写这个程序的时间用手动改也能完成了。不过下次再给我这种任务,就不大费时间了,根据具体树形结构,修改下列表就行了。


by @sunhaiyu

2017.6.20

【Lab】Python改bat文件的更多相关文章

  1. python 使用.bat文件自动执行

    @echo off title demo cmd "/c activate py36 && cd demo&& python demo_test.py&quo ...

  2. .bat 文件调用python脚本

    1.将clearlog.py 脚本放在指定目录 比如 我放在 C:\Users\Administrator\Desktop 上 也就是桌面上 2.创建一个.bat 位后缀名的脚本 3.写入如下脚本 @ ...

  3. bat文件一键运行python自动化脚本

    目标:建立一个双击即可运行自动化脚本的机制,而不用每次运行编译器,方便测试人员用户体验. 方法: 1. 将所有代码打包成exe文件,但一旦修改,又要重新打包. 2. 将运行代码写成bat文件,双击即执 ...

  4. .bat文件和Jar包的生成及运行

    .bat文件和Jar包的生成及运行 1.Jar包简单介绍 Jar包是Java中所特有的一种压缩文档,有点类似于zip包,区别在于Jar包中有一个META-INF\MANIFEST.MF文件(在生成Ja ...

  5. WIN7 如何将BAT文件附加到任务栏

    1.桌面有个 a.bat 文件2.将a.bat 改名为 a.exe3.将 a.exe 拉到任务栏4.修改桌面的 a.exe 回 a.bat5.打开C:\Users\Administrator\AppD ...

  6. python批量进行文件修改操作

    python批量修改文件扩展名 在网上下载了一些文件,因为某种原因,扩展名多了一个后缀'.xxx',手动修改的话因为文件太多,改起来费时费力,于是决定写个小脚本进行修改. 1.要点: import r ...

  7. 给dos命令“.bat”文件换图标

    最近客户有个需求:给企业建立一个FTP服务器,并且给不同的部门分配不同的目录和管理权限. 这个好实现!直接安装serv-u,进行一番设置,搞定! 不过客户嫌登陆FTP操作麻烦,输入ip,输入账号什么的 ...

  8. 怎么做一个bat文件

    怎么做一个bat文件 | 浏览:639 | 更新:2014-11-25 17:02 1 2 3 4 5 6 7 分步阅读 其实做一个.BAT文件很简单,下面我就以做一个清除系统垃圾.BAT文件为例,给 ...

  9. python处理.seq文件

    # Deal with .seq format for video sequence # Author: Kaij # The .seq file is combined with images, # ...

随机推荐

  1. 移动端响应式布局+rem+calc()

    1.媒体查询:@media only screen and (max-width: ) {},在最初做pc端时,使用各种媒体查询,因为pc的屏幕分辨率总共就几种,不嫌麻烦的重复使用类名.有很大的缺陷就 ...

  2. windows端口占用处理工具

    一.描述 笔者在最近使用tomcat时,老是会遇到这种端口占用的问题,便写了这个小的exe,用于解决windows下的端口占用问题. 好吧,其实是我实在记不住CMD下的那几行命令.这玩意的实现比较简单 ...

  3. mysql CMD命令

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  4. Linux下nginx+多个Tomcat负载均衡的实现

    博主原创,转载请注明. 由于项目需要,共创建了10个Tomcat端,由nginx负责转发.9个Tomcat端口分别是8080,11000,12000,13000,14000,15000,16000,1 ...

  5. Linux下重启多个 tomcat 服务的脚本

    由于修改tomcat的配置文件或手动操作数据库数据后,tomcat的缓存和redis的缓存很严重,需要经常重启tomcat来释放缓存,经常就是手动重启. # .查找tomcat的进程ID ps -ef ...

  6. sublime text 3双击选择无法选择$符号

    创建/Data/Packages/User/PHP.sublime-settings文件,内容为"word_separators": "./\\()\"'-:, ...

  7. H5学习第三周

    今天主要总结弹性布局 flex使用 1.给父容器添加display flex/inline-flex;属性 2.父容器可以使用的属性值有 >>>flex-direction 属性决定 ...

  8. EF查询百万级数据的性能测试

    一.起因  个人还是比较喜欢EF的,毕竟不用写Sql,开发效率高,操作简单,不过总是听人说EF的性能不是很好,也看过别人做的测试,但是看了就以为真的是那样.但是实际上到底是怎么样,说实话我真的不知道. ...

  9. jquery.jqprint-0.3.js打印table表格遇到的坑

    在谷歌控制台输入window.print();可以调起当前整个页面的打印预览,那么要想打印页面某块区域内容怎么办呢? 我找到了jqprint插件,其原理是运用iframe 元素创建另外一个文档的内联框 ...

  10. mysql性能监控工具

    参考文档: http://www.linuxidc.com/Linux/2012-09/70459.htm 1.记录慢查询SQL #配置开启 (linux)修改my.cnf: log-slow-que ...