Как можно улучшить код? [поиск строки в шаблоне, формирование нового файла на основе шаблона]

Рейтинг: 0Ответов: 1Опубликовано: 04.06.2023

Изучаю основы питона, решаю задачки. Что-то мне кажется слишком много кода для замены 2х строчек в файле. Посмотрите плз, что можно улучшить и как? Спасибо!

#содержимое файла-шаблона для замены
FIND_1 = '        <h1></h1>\n'
FIND_2 = '\n'

#прием пользовательских данных
name = input('ваше имя: ')
about_me = input('расскажите о себе: ')

#строки на которые надо заменить
string_to_find_1 = f'        <h1>{name}</h1>\n'
string_to_find_2 = f'{about_me}\n'

#открываю файл-шаблон и читаю
file_template = open('html_template.txt', 'r', encoding='utf-8')

#методом readlines() читаю шаблон и возвращаю список file_template_list
file_template_list = file_template.readlines()

#ищу первый элемент списка file_template_list для замены
for count, elem in enumerate(file_template_list):
    if elem == FIND_1:
        #заменяю по индексу
        file_template_list[count] = f'{string_to_find_1}'
        break

#ищу второй элемент списка file_template_list для замены
for count, elem in enumerate(file_template_list):
    if elem == FIND_2:
        #заменяю по индексу
        file_template_list[count] = f'{string_to_find_2}'
        break

#закрываю файл
file_template.close()

#cоздаю файл user_file в режиме записи, записываю в него элементы списка с пользовательскими данными и закрываю файл
user_file = open('user_file.txt', 'w', encoding='utf-8')
for elem in file_template_list:
    user_file.write(elem)
user_file.close()

#открываю user_file в режиме чтения, читаю и вывожу в консоль
user_file = open('user_file.txt', 'r', encoding='utf-8')
text = user_file.read()
print(text)

Ответы

▲ 0
  1. Можно записать пары что_заменить - на_что_заменить в словарь
  2. Для работы с файлами лучше использовать менеджер with
name = 'name'
about_me = 'about'

repl = {
    '        <h1></h1>\n' : f'        <h1>{name}</h1>\n',
    '\n' : f'{about_me}\n',
}

with open('input.txt', 'r', encoding='utf-8') as fin:
    lines = fin.readlines()

for i, line in enumerate(lines):
    lines[i] = repl.get(line, line)

with open('user_file.txt', 'w', encoding='utf-8') as fout:
    for line in lines:
        fout.write(line)

with open('user_file.txt', 'r', encoding='utf-8') as fin:
    text = fin.read()
print(text)

Далее можно не читать, а после заменять; а сразу читать по строке и добавлять нужный вариант:

name = 'name'
about_me = 'about'

repl = {
    '        <h1></h1>\n' : f'        <h1>{name}</h1>\n',
    '\n' : f'{about_me}\n',
}

with open('input.txt', 'r', encoding='utf-8') as fin:
    lines = [repl.get(line, line) for line in fin]

with open('user_file.txt', 'w', encoding='utf-8') as fout:
    for line in lines:
        fout.write(line)

with open('user_file.txt', 'r', encoding='utf-8') as fin:
    text = fin.read()
print(text)

Далее можно слить два with в один:

name = 'name'
about_me = 'about'

repl = {
    '        <h1></h1>\n' : f'        <h1>{name}</h1>\n',
    '\n' : f'{about_me}\n',
}

with open('input.txt', 'r', encoding='utf-8') as fin,\
     open('user_file.txt', 'w', encoding='utf-8') as fout:
    for line in fin:
        fout.write(repl.get(line, line))

with open('user_file.txt', 'r', encoding='utf-8') as fin:
    text = fin.read()
print(text)