python - получить целевую строку в файле и т. д., затем получить конкретную предыдущую строку?

Мне нужно найти определенную строку в некотором выводе. Я могу сделать это, но затем, найдя правильную часть вывода, мне нужно извлечь определенные строки перед этой.

for i, line in enumerate(lines):
 target = str(self.ma3) # set target string
 if target in line:
  print i, line     # this gets the correct line, I can stick it in a variable and do stuff with it
  i = i - 4         # now I want the line 4 lines before the initial target line
  print lines[i]    # doesn't work, gives error: TypeError: 'generator' object has no attribute '__getitem__'

Если кто-нибудь знает, как это сделать, мы будем благодарны за помощь!

2 ответа

Решение

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

lines = list(lines)

# your code

Генератор просто подает вам элементы по одному и не имеет понятия "индексация", в отличие от списка.

Кроме того, если ваш файл очень большой и размещение всех строк в списке будет слишком дорогим, вы можете извлечь 4 элемента за раз из генератора. Таким образом, у вас будет доступ к строке за четыре строки до вашей целевой строки, если вы ее найдете. Вы должны сделать некоторые бухгалтерии, чтобы убедиться, что вы не пропустите ни одной строки.

Согласитесь по поводу списка (строк) ответа. Самое простое решение.

Однако, если ваш входной файл слишком велик, и вы хотите придерживаться генератора, коллекция collection.deque должна работать, чтобы сохранить последние 4 строки в случае, если у вас есть попадание. Старые строки будут отбрасываться по мере продвижения.

from collections import deque

mybuffer = deque(maxlen=4)

for i, line in enumerate(lines):
   mybuffer.append(line)
   #...some more of your code...
   if target in line:
       line_4_lines_before = mybuffer[0]
       line_3_lines_before = mybuffer[1]
Другие вопросы по тегам