Python - удаление линий и предыдущих строк (соответствие шаблонам) - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу найти строки, которые начинаются со слова списка. Если слово найдено, я хочу строку, в которой оно стоит, и предыдущую строку, которая будет удалена. Я могу получить строку и предыдущую и распечатать их, но не могу заставить себя не передавать их в мой выходной файл. F.e.:

в-сайте:

This is not supposed to be deleted.
This shall be deleted. 
Titel

This is not supposed to be deleted.
This is not supposed to be deleted

вне говоря:

This is not supposed to be deleted.

This is not supposed to be deleted.
This is not supposed to be deleted

Я пробовал это с этим кодом, но я продолжаю получать TypeError: объект 'str' не поддерживает назначение элемента

with open(file1) as f_in, open(file2, 'w') as f_out:
    lines = f_in.read().splitlines()
    for i, line in enumerate(lines):
        clean = True
        if line.startswith(('Text', 'Titel')):
            for (line[i-1]) in lines:
                clean = False
            for line in lines:
                clean =False
        if clean == True:
            f_out.write(line)

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вам не нужно читать файл сразу. Читайте строки друг за другом и сохраняйте текущую строку, но записывайте ее только после следующего чтения или нет.

with open("file1") as finp, open("file2","w") as fout:

         lprev=""
         for line in finp:

             if line.startswith("Titel") or line.startswith("Text"):
                 lprev=""
                 continue
             if lprev:
                 fout.write(lprev)
             lprev=line

         if lprev:
             fout.write(lprev)  # write out the last line if needed
0 голосов
/ 13 ноября 2018

Сначала отследите, какие строки вы хотите скопировать:

lines_to_keep = []
with open(file1) as f_in:
    deleted_previous_line = True
    for line in f_in:
         if line.startswith(('Text', 'Titel')):
              if not deleted_previous_line:
                    del lines_to_keep[-1]
              deleted_previous_line = True
              continue
         deleted_previous_line = False
         lines_to_keep.append(line)

Трюк с deleted_previous_line необходим, чтобы гарантировать, что он не удалит слишком много строк, если последовательные строки начинаются с 'Текст' или 'Титель'.

Затем запишите его в выходной файл

with open(file2, 'w') as f_out:
    f_out.writelines(lines_to_keep)
...