【Lab】Python改bat文件
【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的顺序。
上面的修改好后,就剩下全局修改了。因为路径不会是\mainBuilding3\case2\new\,得看具体需求,另外case是多图像才有的。最后的最后,将文件里面的QP32替换成QP27和QP22生成两个副本。在程序中我使用了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文件的更多相关文章
- python 使用.bat文件自动执行
@echo off title demo cmd "/c activate py36 && cd demo&& python demo_test.py&quo ...
- .bat 文件调用python脚本
1.将clearlog.py 脚本放在指定目录 比如 我放在 C:\Users\Administrator\Desktop 上 也就是桌面上 2.创建一个.bat 位后缀名的脚本 3.写入如下脚本 @ ...
- bat文件一键运行python自动化脚本
目标:建立一个双击即可运行自动化脚本的机制,而不用每次运行编译器,方便测试人员用户体验. 方法: 1. 将所有代码打包成exe文件,但一旦修改,又要重新打包. 2. 将运行代码写成bat文件,双击即执 ...
- .bat文件和Jar包的生成及运行
.bat文件和Jar包的生成及运行 1.Jar包简单介绍 Jar包是Java中所特有的一种压缩文档,有点类似于zip包,区别在于Jar包中有一个META-INF\MANIFEST.MF文件(在生成Ja ...
- WIN7 如何将BAT文件附加到任务栏
1.桌面有个 a.bat 文件2.将a.bat 改名为 a.exe3.将 a.exe 拉到任务栏4.修改桌面的 a.exe 回 a.bat5.打开C:\Users\Administrator\AppD ...
- python批量进行文件修改操作
python批量修改文件扩展名 在网上下载了一些文件,因为某种原因,扩展名多了一个后缀'.xxx',手动修改的话因为文件太多,改起来费时费力,于是决定写个小脚本进行修改. 1.要点: import r ...
- 给dos命令“.bat”文件换图标
最近客户有个需求:给企业建立一个FTP服务器,并且给不同的部门分配不同的目录和管理权限. 这个好实现!直接安装serv-u,进行一番设置,搞定! 不过客户嫌登陆FTP操作麻烦,输入ip,输入账号什么的 ...
- 怎么做一个bat文件
怎么做一个bat文件 | 浏览:639 | 更新:2014-11-25 17:02 1 2 3 4 5 6 7 分步阅读 其实做一个.BAT文件很简单,下面我就以做一个清除系统垃圾.BAT文件为例,给 ...
- python处理.seq文件
# Deal with .seq format for video sequence # Author: Kaij # The .seq file is combined with images, # ...
随机推荐
- scrapy中的下载器中间件
scrapy中的下载器中间件 下载中间件 下载器中间件是介于Scrapy的request/response处理的钩子框架. 是用于全局修改Scrapy request和response的一个轻量.底层 ...
- # ? & 号在url中的的作用
1. # 10年9月,twitter改版.一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为http://twitter.com/username改版后,就变 ...
- MongoDB 3.4版本, C# 驱动 2.4 操作
private static string _connStr = "mongodb://127.0.0.1:27017"; private static string _dbNam ...
- arcgis api for js入门开发系列十一地图统计图
上一篇实现了demo的叠加SHP图层,本篇新增地图统计图,截图如下: 地图统计图实现的思路如下:利用拓展arcgis api的js文件(MapChartGraphic.js以及MapChartGrap ...
- JVM中class文件探索与解析(一)
一直想成为一名优秀的架构师的我,转眼已经工作快两年了,对于java内核了解甚少,闲来时间,看看JVM,吧自己的一些研究写下来供大家参考,有不对的地方请指正. 废话不多说,一起来看看JVM中类文件是如何 ...
- memcache基础
一.Memcache是一种缓存技术(内存),你可以把它想像成一张巨大的内存表,形式如下[它就是一个服务] key value key值(字符串) 可以放(字符串[二进制数据[视频.音频.图片]],数值 ...
- Zookeeper:分布式程序的基石
一.目录 1.zookeeper是什么? 2.安装.配置.启动.监控 3.javaApi基础用法 4.应用场景 5.CAP理论/paxos算法 二.zookeeper简介 官方版:zookeeper是 ...
- 用 Docker Machine 创建 Azure 虚拟主机
搭建环境向来是一个重复造轮子的过程,Docker Machine 则把用户搭建 Docker 环境的各种方案汇集在了一起.笔者在<Docker Machine 简介>一文中演示了使用 Do ...
- 探索Windows命令行系列(4):通过命令管理文件和文件夹
1.文件夹操作 1.1.DIR(directory)命令 1.2.TREE 命令 1.3.CD(change directory)命令 1.4.MD(make directory)命令 1.5.RD( ...
- 2.如何搭建MQTT环境
1.源码下载https://github.com/andsel/moquette 注意下载2016.2版本2.idea下载http://confluence.jetbrains.com/display ...