2016-06-14 82 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