Скопируйте каждую строку 3 строки, предшествующие каждому совпадению - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь скопировать строки за четыре строки до строки, содержащей определенное ключевое слово.

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

Мне не нужна строка, где я нашел ключевое слово, но за 4 строки до него.Так как метод записи не работает с номерами строк, я застрял

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Если вы уже используете два файла, это так же просто, как сохранить буфер и записать последние 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
0 голосов
/ 25 апреля 2018

Вы можете просто использовать список, добавлять к списку каждую строку (и усекать до последних 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 строки междуслучаи, то выше это хорошо.Если нет, то вам нужно защититься от записи, проверив, что len last_3 имеет значение == 3, прежде чем снимать первый элемент.

...