复制每个匹配前的每行3行

时间:2018-04-24 22:29:01

标签: python python-2.7 matching sliding-window

我正在尝试在包含特定关键字的行之前复制第四行。

if line.find("keyword") == 0:
    f.write(line -3)

我不需要找到关键字的行,但前面有4行。由于write方法不适用于行号,因此卡住了

2 个答案:

答案 0 :(得分:0)

你可以使用一个列表,每行追加到列表中(截断到最后4行)。当你到达目标线时,你就完成了。

last_3 = []
with open("the_dst_file") as fw:
    with open("the_source_file") as fr:
        for line in fr:
            if line.find("keyword") == 0:
                fw.write(last_3[0] + "\n")
                last_3 = []
                continue
            last_3.append(line)
            last_3 = last_3[-3:]

如果知道文件格式的方式是"关键字"在它之前总是至少有3行,在实例之间至少有3行,那么上面就好了。如果没有,那么你需要通过在拉出第一个元素之前检查last_3的len是否为== 3来防止写入。

答案 1 :(得分:0)

如果您已经使用了两个文件,那就像保留缓冲区并在遇到匹配时写出最后3个条目一样简单:

buf = []  # your buffer
with open("in_file", "r") as f_in, open("out_file", "w") as f_out:  # open the in/out files
    for line in f_in:  # iterate the input file line by line
        if "keyword" in line:  # the current line contains a keyword
            f_out.writelines(buf[-3:])  # write the last 3 lines (or less if not available)
            f_out.write(line)  # write the current line, omit if not needed
            buf = []  # reset the buffer
        else:
            buf.append(line)  # add the current line to the buffer