Рекурсивный поиск файла в подпапках и замена в нем текста

В python практически новичок. Есть следующая задача. Есть корневая папка, допустим "Экзамен". В ней находяться неслько папок: Test1-Math, Test2-English и т.п. В каждой из папок Test есть файл test.txt [содержанием][1]. Задача: найти http://server1.com/exam/index.html и заменить во всех файлах test.txt на значение http://server2.com/exam/${realpath}/index.html. Хотел бы реализовать точно так же как в команде SED ниже

's|http.*index.html|https://server2.com'"${realpath}"'index.html|' "$1/test.txt" > $EXAM/files${realpath}test.txt```
где realpath это название теста например в папке Test1-Math файл test.txt после замены должен иметь строку  http://server2.com/exam/test1-math/index.html вместо http://server1.com/exam/index.html.

Подскажите как это можно реализовать в python скрипте. Пробовал смотреть модель OS по работе с файлами и директориями но пока одни вопросы(
Заранее извиняюсь за такой вопрос.


  [1]: http://ttp://server1.com/exam/index.html

Ответы (1 шт):

Автор решения: strawdog

В общем случае решение может выглядеть так:

(!! Обратите внимание, что информация в файлах перезаписывается, так что будьте аккуратны)

При структуре каталогов, допустим:

Exam\Test1\test.txt
Exam\Test1\Test3\test.txt
Exam\Test2\test.txt

можно поступить так:

from pathlib import Path

p = Path('Exam') # ваша "корневая папка"
sstring = "http://server1.com/exam/index.html"       # строка для поиска

for f in p.rglob('test.txt'): test.txt
    outdata = []                                     # создаем пустой список для хранения исправленных данных
    with f.open(encoding='utf8', mode='r') as ifile: # открываем на чтение
        indata = ifile.readlines()                   # читаем файл построчно в список
        for i in content:                            # проходимся по списку, меняя искомую строку на нужную
            i = i.replace(sstring, f"http://server2.com/exam/{Path(f).parent.name}/index.html")
            outdata.append(i)                        # ^ здесь поставляется имя родительской папки
    with f.open(encoding='utf8', mode='w') as ofile: # открываем тот же файл на запись
        ofile.writelines(outdata)                    # пишем в него измененные данные.
→ Ссылка