Поиск нескольких строк текста в файле

Имеется:

Текстовый файл test.txt:

   1
   2
   3
   5 - НЕ ТА СТРОКА
   4
   D
   6
   5 - НУЖНАЯ СТРОКА
   6
   7
   5

Код:

word = str(raw_input("Введите букву:\n"))
num = str(raw_input("Введите цифру:\n"))  
with open('test.txt', 'r') as file:
     data = file.readlines()
     for line in data:
          if word in line:
               print(line)
               for line in data: 
               # понимаю, что эта строка некорректная,        
               # так как цикл проходит с самого начала файла.
               # Целью было как-то продолжить поиск по файлу,
               # если совпадение найдено.
                    if num in line:
                         print(line)
                         break 

Цель:

Задаем с клавиатуры значение переменной word = D, num = 5. Нужно, чтобы скрипт нашел строку, содержащую букву "D". Если такая строка найдена, нужно найти строку с цифрой "5", которая идет ПОСЛЕ "D" и закончить поиск после первого нахождения.

Цифра "5" только в конкретном примере может находиться через строчку от буквы "D". В реальности подобных файлов много и цифра может быть в любой строке.

Вопрос:

Чем можно заменить некорректную строку в коде и какими способами выполнить необходимый поиск?


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

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

Заменой одной строки тут не обойтись. Тут нужно запоминать в отдельную переменную - была ли уже найдена буква. И в зависимости от этого строить условие.

word = str(raw_input("Введите букву:\n"))
num = str(raw_input("Введите цифру:\n"))

word_is_found = False

with open('test.txt', 'r') as file:
    data = file.readlines()
    for line in data:
        if not word_is_found:  
            if word in line:
                print(line)
                word_is_found = True
        else:
            if num in line:
                print(line)
                break

Либо есть более универсальное решение, которое легко приспособить к любому количеству элементов, которые нужно искать:

word = str(raw_input("Введите букву:\n"))
num = str(raw_input("Введите цифру:\n"))

search_seq = [word, num]
search_idx = 0

with open('test.txt', 'r') as file:
    data = file.readlines()
    
    for line in data:
        search_elem = search_seq[search_idx]
        if search_elem in line:
            print(line)
            search_idx += 1
            if not search_idx < len(search_seq):
                break
→ Ссылка
Автор решения: mkkik
t = \
'''1
2
3
5
4
D
6
5
6
7
5
'''

w = 'D'
n = '5'

def search(d, n, w):
    return d.index(n, d.index(w)) + 1

data = tuple(map(str.rstrip, open('test.txt').readlines()))

try:
    print(('Номер искомой строки: {}').format(search(data, n, w)))
    #-> Номер искомой строки: 8
    print(('Номер искомой строки: {}').format(search(t.split(), n, w)))  
    #-> Номер искомой строки: 8
except ValueError:
    print('Не найдено!')  # или своя логика обработки

    
→ Ссылка
Автор решения: strawdog
import numpy as np
text = np.loadtxt("000.txt", dtype="str") # ['1' '2' '3' '5' '4' 'D' '6' '5' '6' '7' '5']
idx = np.where(text=="D")[0][0] + np.where(text[np.where(text=="D")[0][0]:]=="5")[0][0]
print(idx) # 7
→ Ссылка