Python使用Fileinput替换单词

时间:2016-06-14 22:24:49

标签: python linux macos fileinputstream

我正在使用带有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

2 个答案:

答案 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),