【问题标题】:Replace line in .bat file using python [duplicate]使用python替换.bat文件中的行[重复]
【发布时间】: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


【解决方案1】:

有很多方法可以解决这个问题。很多时候,只需编写一个更简单的算法就可以解决您的问题,因为错误的陷阱更少。

在我的示例中,我们简单地遍历输入文件的每一行,如果该行符合要替换的条件,则我们替换,并将其写入新文件中。否则,我们保持该行不变并将其写入新文件。很好很简单。

无论您的 APPL_End_Address 输入字符串有多长,此方法都将起作用,如上所述,当它比原始字符串长时可能会导致问题。

with open("Fileout.txt",'w') as f:
for line in inputFile:
    if "LVMain_StartAddress=" in line:
        line = line.replace(line.split("=")[1],APPL_End_address)
        f.write("%s\n" % line)
    else:
        f.write("%s" % line)

【讨论】:

  • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
  • 感谢您的帮助..您的解决方案效果很好
猜你喜欢
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多