Рекурсивный поиск файла в подпапках и замена в нем текста
В 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) # пишем в него измененные данные.