Есть несколько проблем с вашим кодом:
fileData
используется до его установки. - Ваш l oop работает только по строкам, которые содержат " Триггерная строка, поэтому вы не сможете выводить остальные строки без изменений.
- Если
fileData
должен содержать все данные, считанные до этого момента, замена повлияет на каждую строку, независимо от того, является ли она содержит триггер или нет. - Выходными данными, вероятно, будет «Всего 0 замененных записей», за которым следует «Не найдено выбранных строк»: Вы подсчитываете вхождения текста, подлежащего замене, сразу после его замены. А поскольку ваш l oop не содержит оператора
break
, будет вычислено предложение else. - Вы воссоздаете и записываете выходной файл для каждой прочитанной строки.
Чтобы устранить эти проблемы, соберите все строки в списке, изменив их, если они содержат триггер. После прочтения всего файла откройте выходной файл и выведите собранные вами строки.
import os
textToFind = '/'
textToReplace = '.'
trigger = "Fx."
sourcepath = os.listdir('InputFiles/')
for file in sourcepath:
inputFile = 'InputFiles/'+ file
print('Conversion is ongoing for:' + inputFile)
with open(inputFile, 'r') as infile:
fileData = []
replacements = 0
for line in infile:
if trigger in line:
fileData.append(line.replace(textToFind, textToReplace))
replacements += 1
else:
fileData.append(line)
destinationPath = 'OutputFile/' + file
with open(destinationPath, 'w') as outfile:
# The lines already contain terminating \n characters.
outfile.write(''.join(fileData))
if replacements > 0:
print('Total %d Record Replaced' % replacements)
else:
print('Did not find selected strings')
Поскольку каждая строка обрабатывается независимо, вы также можете реализовать потоковую версию, в которой сначала открываются входные и выходные файлы. , а затем читать, обрабатывать и писать по одной строке за раз. Это то, что делает программа sed
- вызов sed '/Fx\./ s#/#.#g' inputFile > outputFile
в оболочке выполняет ту же задачу для одного файла.