Замена нескольких строк в файле python
Есть toml-файл, который имеет примерно следующее содержимое:
service-1='v.0.3.63'
service-2='v.0.3.72'
service-3='v.1.2.0'
Я хочу заменить содержимое этого файла на следующее
SERVICE_1_VER='v.0.3.63'
SERVICE_2_VER='v.0.3.72'
SERVICE_3_VER='v.1.2.0'
я могу это сделать, но максимально тупым способом, открывая каждый раз файл и записывая туда новые данные на основе старых
import re
with open ("test.toml", 'r') as f:
old_data = f.read()
new_data = old_data.upper()
with open ("test.toml", 'w') as f:
f.write(new_data)
with open ("test.toml", 'r') as f:
old_data = f.read()
new_data = re.sub(r"'V.", r"'v.", old_data)
with open ("test.toml", 'w') as f:
f.write(new_data)
with open ("test.toml", 'r') as f:
old_data = f.read()
new_data = re.sub(r"-", r"_", old_data)
with open ("test.toml", 'w') as f:
f.write(new_data)
with open ("test.toml", 'r') as f:
old_data = f.read()
new_data = re.sub(r"='", r"_VER='", old_data)
with open ("test.toml", 'w') as f:
f.write(new_data)
но кажется это максимально тупо, я хочу открыть файл, заменить все сразу и закрыть файл, но знаний не хватает(
если делаю цикл типа такого:
with open ("test.toml", 'r') as f:
old_data = f.read()
for new_data in "test.toml":
new_data = old_data.upper()
new_data = re.sub(r"'V.", r"'v.", old_data)
new_data = re.sub(r"-", r"_", old_data)
new_data = re.sub(r"='", r"_VER='", old_data)
with open ("test.toml", 'w') as f:
f.write(new_data)
то получаю только последнее изменение re.sub(r"='", r"_VER='", old_data) (что вполне логично)
помогите, пожалуйста, сделать нормальный цикл)
Ответы (1 шт):
Автор решения: Сергей Кох
→ Ссылка
Чуть-чуть не дожали. Вам надо было читать по строкам, изменять их, и складывать новые в список для записи в файл.
import re
new_data = []
with open("test.toml", 'r') as f:
for line in f.readlines():
new_line = line.upper()
new_line = re.sub(r"'V.", r"'v.", new_line)
new_line = re.sub(r"-", r"_", new_line)
new_line = re.sub(r"='", r"_VER='", new_line)
new_data.append(new_line)
with open("new_test.toml", 'w') as f:
f.writelines(new_data)