使用更新的函数搜索和替换现有python脚本
我需要编写一个Python脚本来更新另一个Python脚本,以便用新函数替换旧代码。基本上,每当它看到类似“Model…Read()或Model…Write(x)”的内容时,它都应该用更新的字符串替换它们。例如,脚本应该找到字符串“Model.CB1_OV_En.Read()”并用“MAPort.Read(Model.CB1_OV_En).Value替换它“。有很多变量需要更新,手工操作会很乏味,所以我很好奇是否有一个好的方法来自动执行。我已经完成了字符串替换函数,但我不确定如何在.py文件中自动查找变量使用更新的函数搜索和替换现有python脚本,python,Python,我需要编写一个Python脚本来更新另一个Python脚本,以便用新函数替换旧代码。基本上,每当它看到类似“Model…Read()或Model…Write(x)”的内容时,它都应该用更新的字符串替换它们。例如,脚本应该找到字符串“Model.CB1_OV_En.Read()”并用“MAPort.Read(Model.CB1_OV_En).Value替换它“。有很多变量需要更新,手工操作会很乏味,所以我很好奇是否有一个好的方法来自动执行。我已经完成了字符串替换函数,但我不确定如何在.py文件中自
def main():
textfile = "C:\\Desktop\\Trip_Logic.py"
with open(textfile, 'r') as file :
filedata = file.read()
readString = "Model....Read()"
if readString in filedata:
print readString[2:7]
filedata = filedata.replace(readString, convertReadHILAPI(readString))
with open(textfile, 'w') as file:
file.write(filedata)
#filedata = filedata.replace(string, convertWriteHILAPI(writeString))
##############################################################
#Example:
readString1 = "Model.CB1_OV_En.Read()"
newReadString1 = "MAPort.Read(Model.CB1_OV_En).Value"
readString2 = "Model.CB2_OV_En.Read()"
newReadString2 = "MAPort.Read(Model.CB2_OV_En).Value"
##############################################################
writeString1 = "Model.CB1_OV_En.Write(1)"
newWriteString1 = "MAPort.Write(Model.CB1_OV_En, Float(1))"
writeString2 = "Model.CB2_OV_En.Write(1)"
newWriteString2 = "MAPort.Write(Model.CB2_OV_En, Float(1))"
##############################################################
def convertReadHILAPI(string):
variableStartIndex = 6
variableStopIndex = string.find(".Read")
varName = string[variableStartIndex:variableStopIndex]
cmd = 'newVarName = "MAPort.Read(Model.%s).Value" % (varName)'
exec cmd
return newVarName
def convertWriteHILAPI(string):
variableStartIndex = 6
variableStopIndex = string.find(".Write")
valueStartIndex = string.find("(")
valueStopIndex = string.find(")")
varName = string[variableStartIndex:variableStopIndex]
value = string[valueStartIndex+1:valueStopIndex]
cmd = 'newVarName = "MAPort.Write(Model.%s, Float(%s)) " % (varName, value)'
exec cmd
return newVarName
if __name__ == '__main__':
main()
你可以用这个。这是一种更具蟒蛇式的方式来实现您的目标:
import re
def main():
fname = r'C:\Desktop\Trip_Logic.py'
with open(fname) as reader:
data = reader.read()
# Model.XXX.Read() => MAPort.Read(Model.XXX).Value
data = re.sub(r'(Model\.(.+)\.Read\(\))',
r'MAPort.Read(Model.\2).Value',
data)
# Model.XXX.Write(N) => MAPort.Write(Model.XXX, Float(N))
data = re.sub(r'(Model\.(.+)\.Write\((\d+)\))',
r'MAPort.Write(Model.\2, Float(\3))',
data)
with open(fname, 'w') as writer:
writer.write(data)
你可以用这个。这是一种更具蟒蛇式的方式来实现您的目标:
import re
def main():
fname = r'C:\Desktop\Trip_Logic.py'
with open(fname) as reader:
data = reader.read()
# Model.XXX.Read() => MAPort.Read(Model.XXX).Value
data = re.sub(r'(Model\.(.+)\.Read\(\))',
r'MAPort.Read(Model.\2).Value',
data)
# Model.XXX.Write(N) => MAPort.Write(Model.XXX, Float(N))
data = re.sub(r'(Model\.(.+)\.Write\((\d+)\))',
r'MAPort.Write(Model.\2, Float(\3))',
data)
with open(fname, 'w') as writer:
writer.write(data)
这太完美了!谢谢你这太完美了!非常感谢。