Прежде всего, вы получили некоторые опечатки в своем коде - в некоторых местах вы написали l_pos
, а в других lv_pos
.
Другая проблема в том, что я не думаю, что вы понимаете, что file_l1
- это список списков, поэтому if word in file_l1:
не делает то, что вы думаете. Вам необходимо проверить каждый word
по каждому из этих подсписков.
Вот некоторый рабочий код, основанный на вашем собственном:
fname_in = "simple_test.txt"
l_pos = []
search_list = ['word1', 'word2']
with open(fname_in) as f:
lines = f.read().splitlines()
for i, line in enumerate(lines):
for word in search_list:
if word in line:
l_pos.append(lines[i - 1])
print(l_pos) # -> ['I want this line1.', 'I want this line2.']
Обновление
Вот еще один способ сделать это, который не требует считывания всего файла в память сразу, поэтому не требует такого большого количества памяти:
from collections import deque
fname_in = "simple_test.txt"
l_pos = []
search_list = ['word1', 'word2']
with open(fname_in) as file:
lines = (line.rstrip('\n') for line in file) # Generator expression.
try: # Create and initialize a sliding window.
sw = deque(next(lines), maxlen=2)
except StopIteration: # File with less than 1 line.
pass
for line in lines:
sw.append(line)
for word in search_list:
if word in sw[1]:
l_pos.append(sw[0])
print(l_pos) # -> ['I want this line1.', 'I want this line2.']