2016-06-14 79 views
0

我正在使用Python 2.7和MAC OS X,並編寫了一個程序用另一個單詞替換文件中的單詞。任何時候該單詞出現在該文件中,我都希望用用戶指定的另一個單詞替換它。它似乎正在工作,但它似乎是從文件複製底部輸出一些額外的行。有誰知道它爲什麼這樣做?使用FileInput替換單詞的Python

原始文件:

TCPServeraddress  april.com 
NODename    hostname 
COMMmethod   TCPip 
NFSTIMEout   0 
TCPBuffsize   32 
TXNB     25600 
TCPWINDOWSIZE   64 
TCPNODELAY   YES 
LARGECOMMBUFFERS  YES 
MANAGEDServices  Schedule 
SCHEDMODe    prompted 
PASSWORDAccess  generate 
ERRORLOGRetention  2 d 
ERRORLOGName   /ngs/hostname/logs/dsmerror.log 
SCHEDLOGRetention  2 d 
SCHEDLOGName   /ngs/hostname/logs/dsmsched.log 

運行我的腳本後,用戶將輸入「測試」作爲主機名:

import fileinput 


textToSearch = "hostname" 
print ("Please type in the TSM Hostname:") 
textToReplace = raw_input("Hostname/Nodename: ") 

print ("***Updating dsm.sys file****") 
fileToSearch = "/Users/bob/Desktop/FinalizedPythonScripts/helloworld" 

tempFile = open(fileToSearch, 'r+') 

for line in fileinput.input(fileToSearch): 
    tempFile.write(line.replace(textToSearch, textToReplace)) 
tempFile.close() 

我正確地獲得修改後的文件,但有額外的「smsched.log 「作爲原始文件中不存在的最後一行,我重複了這個過程,並且每次都發生:

TCPServeraddress  april.com 
NODename    test 
COMMmethod   TCPip 
NFSTIMEout   0 
TCPBuffsize   32 
TXNB     25600 
TCPWINDOWSIZE   64 
TCPNODELAY   YES 
LARGECOMMBUFFERS  YES 
MANAGEDServices  Schedule 
SCHEDMODe    prompted 
PASSWORDAccess  generate 
ERRORLOGRetention  2 d 
ERRORLOGName   /ngs/test/logs/dsmerror.log 
SCHEDLOGRetention  2 d 
SCHEDLOGName   /ngs/test/logs/dsmsched.log 
smsched.log 
+0

可能是由於使用'fileinput.input'迭代它而修改文件引起的。也許最好把文件加載到內存中,修改它,然後將輸出寫回去。特別是如果你沒有特別使用'fileinput'。 –

回答

0

使用fileinput.input(filePath, inplace=True)方法,而不是open(..) method

這裏的腳本:

import fileinput 

textToSearch = "hostname" 
print ("Please type in the TSM Hostname:") 
textToReplace = raw_input("Hostname/Nodename: ") 
print ("***Updating dsm.sys file****") 
fileToSearch = "/Users/bob/Desktop/FinalizedPythonScripts/helloworld" 
for line in fileinput.input(fileToSearch, inplace=True): 
    print line.replace(textToSearch, textToReplace), 
+0

謝謝你的工作! – aznjonn

0

好了,想着這很長一段時間後,我的答覆如下:

變化從開放式「R +」到「W」(或者「W +」,沒試過)

編輯2:這些似乎並不奏效。嘗試類似於在重新寫入文件之前複製文件的內容,然後在讀出和格式化複製的內容時從頭開始重寫文件。

好吧,讓我解釋一下: 我沒去太深成「R +」模式是如何工作的,但因爲它是應該允許讀寫,我想發生的事情是,寫文件時它從一開始就取代了現有的字符。對於每個新寫入的字符,都會被替換(如在文本編輯器中替換模式)。

現在,當你寫你的文件line.replace(textToSearch,textToReplace),它確實有一個有效行:

舊線:

ERRORLOGName   /ngs/hostname/logs/dsmerror.log\n 

新行:

ERRORLOGName   /ngs/test/logs/dsmerror.log\nlog\n 

音符如何最後4個字符被保留,因爲主機名是8個字符長,但測試是4個字符長。

這並不明顯,因爲您在每行的末尾複製"\n",並分別替換它。但最後,你做3個將取代(在此文件的情況下),所以你只剩下最後的12個字符:"\nsmsched.log"

+0

我嘗試了你的建議,但最終刪除了運行腳本後文件「helloworld」中的所有內容 – aznjonn

+0

對不起,我還沒有嘗試過。請參閱我的編輯進行闡述。你可能會自己找到另一種方式。嘗試在打開寫入之前在某處複製文件內容,或嘗試「w +」模式。刪除內容的原因是因爲'for file input.input(fileToSearch)中的行:'在*之後執行*在寫模式下打開文件,這將刪除所有內容。 – Aprillomat

+0

我相信你對所發生的事情是正確的。我嘗試了「w」和「w +」,但這只是刪除了文件的全部內容 – aznjonn