2016-06-14 3 views
0

Я использую Python 2.7 с MAC OS X и написал программу для замены слова в файле другим словом. В любое время, когда это слово появляется в этом файле, я хочу, чтобы оно было заменено другим словом, которое пользователь указывает. Кажется, что он работает, но, похоже, выводит пару дополнительных строк внизу, которые копируются из файла. Кто-нибудь знает, почему он это делает?Python Использование Fileinput для замены слов

Исходный файл:

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

Хорошо, подумав об этом в течение длительного времени, вот мой ответ:

изменение открытого типа с «г +» до «ж» (или, может быть, «ш +», не пробовал)

Редактировать 2: Они не работают. Попробуйте что-то вроде копирования содержимого файла перед его повторной записью, затем перезапишите файл с нуля, читая и форматируя скопированное содержимое.

Хорошо, позвольте мне уточнить: я не слишком глубоко в то, как работает режим «г +», но так как она должна позволить читать и писать, я думаю, что случается, когда запись в файл , он заменяет существующие символы с самого начала. для каждого нового записанного символа один заменяется (например, режим замены в текстовом редакторе).

Теперь, когда вы пишете в файл 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 line in fileinput.input (fileToSearch):' выполняется * после * вы открываете файл в режиме записи, который удаляет все. – Aprillomat

+0

Я считаю, что вы правы в том, что происходит. Я попробовал как «w», так и «w +», но это просто удалит весь контент файла. – aznjonn