python - поиск и замена в файлах - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы проанализировать файл построчно и заменить фиксированную пунктуацию другой пунктуацией (например, точки "/" с косой чертой "."), Только если эта строка в строке содержит определенную переменную

Example: Replace only if the string contains Fx

line1: test1/test2
line2: .test + e/y + Fx/var1/var2

Output:
line1: test1/test2
line2: .test + e/y + Fx.var1.var2

Как я могу go сделать это? Код до сих пор, но я знаю, что он не работает

import os

textToFind = '/'
textToReplace = '.'
sourcepath = os.listdir('InputFiles/')

def lines_that_contain(string, fp):
    return [line for line in fp if string in line]

for file in sourcepath:
    inputFile = 'InputFiles/'+ file
    print('Conversion is ongoing for:' +inputFile)
    with open(inputFile, 'r') as inputFile:
        for line in lines_that_contain("Fx.", inputFile):
            print('found Fx.')
            fileData = fileData.replace(textToFind, textToReplace)
            freq2 = 0
            freq2 = fileData.count(textToFind)

            destinationPath = 'OutputFile/' + file
            with open(destinationPath, 'w') as file:
                file.write(fileData)
                print ('Total %d Record Replaced' %freq2)
        else:
            print('Did not find selected strings')

1 Ответ

0 голосов
/ 08 апреля 2020

Есть несколько проблем с вашим кодом:

  • 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 в оболочке выполняет ту же задачу для одного файла.

...