Питон - подсчет количества глав, в котором встречается искомое слово

Изначально задача следующая - дан текстовый файл txt, разбитый по словам, главы в нем разделяются строкой '[new chapter]'). Необходимо написать программу, которая посчитает количество глав, в котором встречается искомое слово. Моя идея состояла в том, чтобы составить список из индексов, которым соответствует строка '[new chapter]' и далее написать цикл, считающий количество глав, в которых участвует искомое слово с помощью переменной counter. С первой частью задачи справилась, дальше начались проблемы. Не понимаю как перебрать все индексы, в которых используется искомое слово (потому что в текущем коде берется тот индекс, когда слово встречается только первый раз. Сомневаюсь, что правильно написала в целом второй цикл, результат выдается, но некорректный:

def read_data():
    data = open('/Users/taisiamoiseenko/Desktop/MISIS/Python/war_peace_processed.txt', 'rt').read()
    return data.split('\n')

data = read_data()
target_word='князь'
indexes=[]
counter=0
for index,value in enumerate(data):
    if value=='[new chapter]':
        indexes.append(index)
for i in indexes:
    j=0
    if j<data.index(target_word)<i:
        j+=i
        i+=1
        counter+=1
print(counter)

Буду благодарна помощи и советам.


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

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

Я бы не стал зачитывать весь файл в память (лишняя трата памяти). А просто бы читал его построчно и сразу бы анализировал.

Как только встретился маркер новой главы - ставил бы флаг, что можно искать слово.
Для остальных строк если стоит этот флаг, то искал бы слово. Если нашёл, то увеличивал бы счётчик и сбрасывал флаг (чтобы не искать в этой главе дальше и по-быстрому промотать строки до следующего маркера главы).

target_word = 'князь'

with open('file.txt', 'rt') as fp:
    counter = 0
    search = True  # если надо ждать начала первой главы, то можно поставить False
    for line in fp:
        line = line.rstrip('\n')
        if line == '[new chapter]':
            search = True
        elif search and target_word in line: # можно применить более точный поиск по словам если требуется
            counter += 1
            search = False
            
    print(counter)
→ Ссылка