Поиск нескольких строк текста в файле
Имеется:
Текстовый файл 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 шт):
Заменой одной строки тут не обойтись. Тут нужно запоминать в отдельную переменную - была ли уже найдена буква. И в зависимости от этого строить условие.
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
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('Не найдено!') # или своя логика обработки
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