我正在使用带有MAC OS X的Python 2.7并编写了一个程序,用另一个单词替换文件中的单词。只要该文件出现在该文件中,我就会将其替换为用户指定的另一个单词。它似乎正在工作,但似乎在底部输出了几个从文件中复制的额外行。有谁知道它为什么会这样做?
原始档案:
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
运行我的脚本后,用户将输入“test”作为主机名:
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 :(得分:0)
好的,经过长时间的思考,这是我的回答:
将打开类型从“r +”更改为“w”(或者可能是“w +”,未尝试过)
编辑2:这些似乎不起作用。尝试复制文件内容,然后重新编写文件,然后在读取和格式化复制的内容时从头开始重写文件。
好的,让我详细说明一下: 我没有深入研究“r +”模式是如何工作的,但由于它应该允许读写,我想当发生在你的文件中时,它会取代现有的字符。一开始。对于每个新写入的char,都会替换一个(如文本编辑器中的替换模式)。
现在,当您写入文件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"
答案 1 :(得分: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),