【发布时间】:2020-07-21 07:47:05
【问题描述】:
我是 python 新手,在处理 .bat 文件时卡住了
1) 我有一个 .bat 文件,其中包含以下几行:
set local_dir=%~d0%~p0
set LVMain_StartAddress=0xfaff
set LVMain_EndAddress=0x0f4ff
set HVMain_StartAddress=0x01d00
set HVMain_EndAddress=0x095ff
set LVMain_StartAddressMerged=0x0D000
set LVMain_EndAddressMerged=0x0fcff
set HVMain_StartAddressMerged=0x01001d00
set HVMain_EndAddressMerged=0x010095dd
2) 一个 python 脚本在文件中运行以查找“set LVMain_StartAddress=0xfaff”行
3) 当它找到该行时,我想用一个新的替换十六进制地址。有时新的十六进制地址是 5 个字符长
4) 下面是我为此编写的 python 代码:
# write LVMain start address in .bat file
with open("..\..\..\Tools\Scripts\GenerateRomTestChecksums.bat", "r+") as f:
#read lines individually until we find where to write LvMain Start address
BatFileLine = f.readline()
while( (LVMain_StartPattern in BatFileLine ) == False ):
BatFileLine = f.readline()
#set marker back to the beginning of the line
LineMarker = int(f.tell()) - (int(len(BatFileLine)) + 0x01)
f.seek(LineMarker)
#split string where address starts to write new address in file
name, hex_address = BatFileLine.split('0x')
#append new address and carriage return
name = name + APPL_End_address + "\n"
print(len(name))
contents = f.read(len(BatFileLine)).replace(BatFileLine,name)
f.seek(LineMarker)
f.write(name)
这是更大函数的一部分,“APPL_End_address”作为参数给出
5) 当我运行此代码时,新的十六进制地址是 5 个十六进制数字宽,我得到以下输出:
新的十六进制地址似乎正确写入,但下一行的第一个字符被擦除。任何想法为什么?
【问题讨论】:
-
这种遍历行的方式太复杂了,很容易导致错误,比如你在这里遇到的错误。您应该只使用
for line in file并将原始行或修改后的行输出到新文件。 -
我对python一无所知,但您似乎不使用行,而是使用字节位置。所以当你写的一行比原来长的时候,它会覆盖下一行的开头。
-
您可以将所有文本读入内存(并关闭文件),使用
all_text.replace("set LVMain_StartAddress=0xfaff", "set LVMain_StartAddress=new_address")并将所有文本写回同一个文件。
标签: python python-3.x file batch-file python-3.7