向后重新定位文件多行(python)

时间:2012-05-22 22:21:39

标签: python seek

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

iter1
iter2
iter3
[n行的东西]
FLAG =值

iter1
iter2
iter3
iter4
iter5
[n行的东西]
FLAG =值
等....

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

我想做这样的事情:

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  

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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函数中的逻辑可能不是最佳的,甚至可能是错误的。