Python 使用 Fileinput 替换单词

Python Using Fileinput to Replace Words

我正在使用 Python 2.7 和 MAC OS X 并编写了一个程序来用另一个词替换文件中的一个词。每当该词出现在该文件中时,我都希望将其替换为用户指定的另一个词。它似乎在工作,但它似乎在底部输出了几行从文件中复制的额外行。有谁知道它为什么这样做?

原文件:

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

好的,想了半天,我的回答是:

将打开类型从"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"

使用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),