2016-01-24 79 views
0

Python 3 - 尝试在Cisco路由器部署脚本。 我正在尝试在'router-input.txt'的输入值中替换多个文本值。不幸的是,我无法弄清楚如何在一个文件中替换多个值。在运行下面的代码结束时,只输入最后一个值IOSOLD。在单个文件中替换多个文本值

import fileinput 

HOSTNAME = input("Hostname: ") 
IOSCURRENT = input("Current IOS image: ") 
IOSOLD = input("Old IOS image: ") 


f = open("router-input.txt",'r') 
filedata = f.read() 
f.close() 

newdata = filedata.replace("$HOSTNAME", HOSTNAME) 
newdata = filedata.replace("$IOSCURRENT", IOSCURRENT) 
newdata = filedata.replace("$IOSOLD", IOSOLD) 


f = open('output.txt','w') 
f.write(newdata) 
f.close() 

回答

0

如果文件太大,读取文件并将其保存在内存中效率可能非常低下。我可能会这样做

search_replace_dict = { 
    "$HOSTNAME": 'HOSTNAME', 
    "$IOSCURRENT": 'IOSCURRENT', 
    "$IOSOLD": 'IOSOLD'} 

with open("router-input.txt") as input_file, open('output.txt','w') as output_file: 
    for each_line in input_file: 
     for key, value in search_replace_dict.items(): 
      each_line = each_line.replace(key, value) 
     output_file.write(each_line) 
+0

我能够替换HOSTNAME值,但其他两个不会被替换。这是否需要循环或某种? – Richardwang5000

+0

ohh耶对不起,只是修复了答案 – skar

+0

我收到下面的输出和一个空的output.txt - AttributeError:'字典'对象没有属性'iteritems' – Richardwang5000

1

您继续编辑filedata并将其保存在newdata。每次您都覆盖以前的更改。请尝试:

newdata = filedata.replace("$HOSTNAME", HOSTNAME) 
newdata = newdata.replace("$IOSCURRENT", IOSCURRENT) 
newdata = newdata.replace("$IOSOLD", IOSOLD) 
+0

所以我应该编辑所有行的'newdata.replace'? 'newdata = hostname.replace(“$ HOSTNAME”,HOSTNAME) newdata = ioscurrent.replace(“$ IOSCURRENT”,IOSCURRENT) newdata = iosold.replace(“$ IOSOLD”,IOSOLD)' – Richardwang5000

+0

Yes ... if你的意思是有些行被忽略了,它们做同样的事情......'str.replace'不编辑它所操作的字符串,而是返回一个新的字符串。 –

+0

有没有更高效的方法?可能通过循环?我希望有30个值可以替换成单个文件。 – Richardwang5000