Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将文件向后重新定位到多行(python)_Python_Seek - Fatal编程技术网

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

将文件向后重新定位到多行(python),python,seek,Python,Seek,我正在使用Python读取以下格式的文件: iter1 iter2 iter3 [n行内容] 标志=值 iter1 iter2 iter3 iter4 iter5 [n行内容] 标志=值 等等 我想搜索FLAG,读取该值,然后倒回'n'行,读取最终迭代的值。请注意,迭代次数并不总是相同的。每个文件中的行数“n”是一致的;但是,这些行可能包含不同的字节数,因此使用seek功能时遇到问题 我想这样做: f = open(file) for i in f: a = re.search(

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

iter1
iter2
iter3
[n行内容]
标志=值

iter1
iter2
iter3
iter4
iter5
[n行内容]
标志=值
等等

我想搜索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  
假设你的“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

一般来说,最简单的方法是一次读取一个文件,并在以后经过时记住所需的位。

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

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
函数中的逻辑可能不是最优的,甚至可能是错误的。

你能把整个文件读入内存吗?还是太大了?我想他应该返回
n行,而不仅仅是一行。他必须返回多少行并不重要。他想要最后一行
iter
,即
[n行内容]
之前的那一行(在他的第一个数据集中是
iter3
,在第二个数据集中是
iter5
)。