2016-01-24 96 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

相關問題