python - 获取文件中的目标行等,然后得到一个特定的前一行?

时间:2014-08-29 16:13:26

标签: python string enumerate readlines

我需要在某些输出中找到某一行。我可以这样做,但是在找到输出的正确部分之后,我需要在那之前提取某些行。

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 个答案:

答案 0 :(得分:5)

您需要使用列表进行随机访问:

lines = list(lines)

# your code

生成器只会一次为您提供一个项目,并且没有与列表不同的索引概念。

或者,如果您的文件非常大并且将所有行放入列表中会太昂贵,那么您可以从生成器一次提取4个项目。这样,您可以在找到目标行之前访问该行四行。你必须做一些簿记,以确保你不会跳过任何一行。

答案 1 :(得分:1)

同意列表(行)的答案。最简单的解决方案。

但是,如果您的输入文件太大并且您想要坚持使用生成器,那么collections.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]