Python метод replace и f-string
Есть f-строка с текстом, который мне нужно изменить. Изменить не только значение переменной, но и сохранить изменения в файл, чтоб при перезапуске программы строка не возвращалась к своему изначальному значению.
Вот так всё работает правильно:
text = "Simple text."
def text_change(new_text):
global text
old = text
new = new_text
text = text.replace(old, new) # меняю значение переменной
with open("main.py", "r") as file: # открываю файл
old_data = file.read()
new_data = old_data.replace(old, new) # нахожу в нём нужную мне строку и изменяю её
with open("main.py", "w") as file: # сохраняю изменения в файле
file.write(new_data)
file.close() # закрываю поток
text_change(new_text="New simple text.") # запускаю функцию
Функция корректно работает, изменяется значение переменной, файл перезаписывается, при перезапуске программы изменения сохраняются.
Но если изменить переменную text на:
f_text = "f-string"
text = f"Simple text with using\n" \
f"{f_text}"
Текст в переменной меняется, но изменения не записываются в файл. При перезапуске программы, переменная text возвращается к своему стандартному значению.
Как правильно адаптировать мою функцию под изменение f-строк?
Ответы (2 шт):
Ну, во-первых, текст-то меняется, но только в переменной text. А в файл пишется переменная new_data, в которой текст не меняется. Потому что в ней ищется текст
Simple text with using
f-string
а такого текста в ней нет.
Опишите точно задачу, которую решаете, потому что это похоже на проблему XY.
Функция text_change ищет и заменяет строку old в файле main.py, но когда вы используете f-строку, строка old не совпадает с текстом в файле, поскольку она может иметь разный формат. Чтобы адаптировать ф-ю для f-строк, вы можете задать строку old как конкретную f-строку, которую вы хотите изменить :
old = f"Simple text with using\n{f_text}"
Если вам нужно заменить множество f-строк в файле, стоит смотреть в сторону регулярных выражений.
import re
def text_change(new_text):
global text
old = f"Simple text with using\n{f_text}"
new = new_text
text = re.sub(old, new, text)
with open("main.py", "r") as file:
old_data = file.read()
new_data = re.sub(old, new, old_data)
with open("main.py", "w") as file:
file.write(new_data)
file.close()
text_change(new_text="New simple text.")
или так:
import ast
def text_change(new_text):
global text
old = f"Simple text with using\n{f_text}"
new = new_text
text = ast.literal_eval(f"f'{old}'").replace(f_text, new_text)
with open("main.py", "r") as file:
old_data = file.read()
new_data = old_data.replace(old, text)
with open("main.py", "w") as file:
file.write(new_data)
file.close()
text_change(new_text="New simple text.")