Как искать и заменять строку на месте в файле - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь найти и заменить конкретную строку из моего входного файла.

sample.txt

// This is header                                                                           
// *  Copyright 2017-2018, Company name  *
// * abc      : TBD                      *

Код:

import re
import fileinput

with fileinput.FileInput("sample.txt", inplace=True, backup='.bak') as file:
    for line in file:
        m = re.search('.*Copyright\s+(.+?),\s+Company', line, re.MULTILINE|re.DOTALL)
        if m:
            found = m.group(1)
            print(line.replace(found,'2021', line.rstrip()))

Ошибка :

Traceback (most recent call last):
  File "tmp.py", line 23, in <module>
    print(line.replace(found,'2021', line.rstrip()))
TypeError: 'str' object cannot be interpreted as an integer

Ожидаемый результат sample.txt:

// This is header                                                                           
// *  Copyright 2021, Company name  *
// * abc      : TBD                 *

Не уверен, что именно не так в этом коде. Может ли кто-нибудь помочь мне это исправить? Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Должно быть:

print(line.rstrip().replace(found, '2021'))

Третий аргумент replace() - это максимальное количество замен, которое необходимо сделать, которое должно быть целым числом. Строка, с которой вы работаете, не является аргументом, она указывается перед именем метода.

Кроме того, вам нужно распечатать строку, ничего не заменяя, если она не соответствует регулярному выражению, чтобы несоответствие строки записываются обратно в файл.

with fileinput.FileInput("sample.txt", inplace=True, backup='.bak') as file:
    for line in file:
        m = re.search('.*Copyright\s+(.+?),\s+Company', line)
        if m:
            found = m.group(1)
            print(line.rstrip().replace(found, '2021'))
        else:
            print(line.rstrip())

И нет необходимости во флагах re.MULTILINE и re.DOTALL, поскольку вы обрабатываете только одну строку за раз.

1 голос
/ 14 июля 2020

Попробуйте следующее:

import re

with open("sample.txt", "r") as file:
    for line in con.split("\n"):
        m = re.sub('.*Copyright\s+(.+?),\s+Company', "2021", line)
        if m:
            print(m)
1 голос
/ 14 июля 2020

Метод str.replace() принимает 3 параметра:

  • подстроку, которую нужно удалить и заменить другой

  • подстроку для замены удаленная подстрока

  • максимальное количество подстрок для замены

Как видите, третий параметр может быть только целым числом, но в print(line.replace(found,'2021', line.rstrip())), line.rstrip() - строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...