非常陌生,并且已经编写了一个脚本来挑选基本日志文件的某些行
基本上该函数搜索文件的行,当它找到我要输出到单独文件的行时,将其添加到列表中,然后在其后添加接下来的五行。然后以不同的函数将其输出到最后的单独文件中。
我一直在尝试做的是跳过循环从这五行中的最后一行继续,而不是再次检查它们。我认为代码中的最后一行可以解决问题,但遗憾的是没有。
我可以为此目的使用for循环的任何推荐变体吗?
def readSingleDayLogs(aDir):
print 'Processing files in ' + str(aDir) + '\n'
lineNumber = 0
try:
open_aDirFile = open(aDir) #open the log file
for aLine in open_aDirFile: #total the num. lines in file
lineNumber = lineNumber + 1
lowerBound = 0
for lineIDX in range(lowerBound, lineNumber):
currentLine = linecache.getline(aDir, lineIDX)
if (bunch of logic conditions):
issueList.append(currentLine)
for extraLineIDX in range(1, 6): #loop over the next five lines of the error and append to issue list
extraLine = linecache.getline(aDir, lineIDX+ extraLineIDX) #get the x extra line after problem line
issueList.append(extraLine)
issueList.append('\n\n')
lowerBound = lineIDX
答案 0 :(得分:1)
您应该使用while
循环:
line = lowerBound
while line < lineNumber:
...
if conditions:
...
for lineIDX in range(line, line+6):
...
line = line + 6
else:
line = line + 1
答案 1 :(得分:0)
我会看一下像:
from itertools import islice
with open('somefile') as fin:
line_count = 0
my_lines = []
for line in fin:
line_count += 1
if some_logic(line):
my_lines.append(line)
next_5 = list(islice(fin, 5))
line_count += len(next_5)
my_lines.extend(next_5)
这样,通过在输入上使用islice
,您就可以提前移动迭代器,并在5行(如果文件末尾附近可能更少)用尽之后继续。
这是基于我是否正确理解您可以通过文件向前读取,识别一行,并且只想在该点之后获得固定数量的行,然后按照正常情况恢复循环。 (你可能甚至不需要计算行数,因为它只是用于getline
,而不是任何其他目的。
如果您确实想要接下来的5行,并且仍然考虑以下行,则可以使用itertools.tee
在错误行的位置进行分支,并使用islice
并{ {1}}迭代器在下一行继续。
答案 2 :(得分:0)
for循环使用范围内的迭代器,因此您可以更改循环变量。
考虑使用while循环。这样,您可以直接更新行索引。