我需要在某些输出中找到某一行。我可以这样做,但是在找到输出的正确部分之后,我需要在那之前提取某些行。
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__'
如果有人知道如何做到这一点,我们将不胜感激!
答案 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]