3

我正在使用 Python 读取以下格式的文件:

iter1
iter2
iter3
[n 行内容]
FLAG = value

iter1
iter2
iter3
iter4
iter5
[n 行内容]
FLAG = value
等....

我想搜索 FLAG,读取该值,然后倒退“n”行并读取最终迭代的值。请注意,迭代次数并不总是相同。每个文件中的行数“n”是一致的;但是,这些行可能包含不同数量的字节,因此我无法使用 seek 功能。

我想做这样的事情:

f = open(file)  
for i in f:  
    a = re.search('FLAG')  
    if a:  
          print a  
          spot=f.tell() #mark original spot  
          f.seek(-n,1)  #rewind by n lines  
          b = re.search('iter')  
          print b  
          f.seek(spot) #return to FLAG line, continue to next data set  
4

2 回答 2

1

假设您的“n 行内容”不包含任何以“iter”开头的行,那么您会使问题变得更加困难。您需要做的就是跟踪您看到的以“iter”开头的最后一行。然后,当您看到“FLAG=”时,您已经拥有该数据;无需“倒带”并寻找它。

lastiterline = None
with open(filename) as f:
    for line in f:
        line = line.strip()
        if line.startswith("iter"):
           lastiterline = line
        elif line.startswith("FLAG"):
           if lastiterline:
               print line
               print lastiterline
           lastiterline = None

一般来说,最简单的方法是读取一次文件并记住以后需要的位。

于 2012-05-22T22:40:48.290 回答
0

对于一般此类问题,您可以逐块读取和处理文件:

def flagblocks(filename):
    with open(filename) as f:
        yieldlist = []
        for line in f:
            if not line.strip():
                continue
            if not line.startswith("FLAG"):
                yieldlist.append(line)
                continue
            yield yieldlist
            yieldlist = []
         yield yieldlist


for flagblock in flagblocks("filename"):
    process_flagblock_lines(flagblock)

您的特殊情况下的处理功能仍然与 kindall 建议的基本相同。

函数中的逻辑flagblocks可能不是最优的,甚至是错误的。

于 2012-05-22T22:42:25.530 回答