Python: удалить определенные строки из файла

Я делаю программу, которая удаляет определенные строки из существующего файла. Он берет файл1 как запись (f1), ищет определенный шаблон и, если находит его, модифицирует строку (чтобы сделать ее совместимой с другим файлом) и сохраняет эту модификацию в переменной 'mark'. Он открывает другой файл f2 и ищет в нем «метку». Если он находит «метку» в определенной строке в f2, я должен удалить эту строку и три строки после нее. Дело в том, что когда я ее запускаю, программа удаляет все из f2, поэтому в результате я получаю пустой файл.

new=''
pattern2 = '2:N:0:8'
i=0


f1=open('test_reverse.txt','r')
for line in f1:
    if pattern2 in line:
        mark=line.replace('2:N:0:8','1:N:0:8')
        f2=open('test_OKforward2.txt','r')
        lines=f2.readlines()
        for i, line in enumerate(lines):
            if mark in lines[i]:
                e=lines[i]
                e1=lines[i+1]
                e2=lines[i+2]
                e3=lines[i+3]
                new=e+e1+e2+e3
            f3=open('test_OKforward2.txt','w')
            if line!=new:
                f3.write(line)

Я также пытался использовать функцию next(), но получил тот же результат и ошибку «остановить итерацию».


person Luc    schedule 29.11.2015    source источник
comment
Пожалуйста, не забудьте вернуться и принять ответ, который вы считаете наиболее полезным для вас. Это приносит пользу вам, тем, кто пытается ответить на ваш вопрос, и сообществу в целом. Вот так мы здесь говорим «спасибо».   -  person code_dredd    schedule 30.11.2015


Ответы (1)


Дело в том, что когда я ее запускаю, программа удаляет все из f2, поэтому в результате я получаю пустой файл.

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

Обратите внимание на эти строки:

f2=open('test_OKforward2.txt','r')
# ...
f3=open('test_OKforward2.txt','w')

Проблема в том, что f3 открывает тот же файл, что и f2, для записи для каждого цикла в строках файла f2.

По сути, после добавления строк вы снова открываете файл для записи, удаляя то, что у вас было ранее.

Во-первых: вы должны удалить f3=open из цикла, повторяющегося в каждой строке f2 (т. е. сделать это в другом месте за пределами этого цикла). Это главная проблема.

Второе: вместо этого используйте временный файл для процесса и, в конце, переименуйте временный файл в тот, который у вас был.

Третье: вы не закрываете файлы. Рассмотрите возможность использования контекстных менеджеров. Ваш код будет выглядеть примерно так:

with open('something.txt') as f2:
    # do something with f2;
    # f2 with be automatically closed when it exits the ctx manager

Четвертое. Следуйте стандартам стиля PEP-8. для вашего кода. Все, кто читает ваш код, будут вам благодарны.

Я получил [...] ошибку «остановить итерацию».

Это нормально; вы сказали, что используете функцию next(). Итераторы и next() вызывают StopIteration, чтобы сигнализировать о том, что они не могут производить больше элементов из итерируемой коллекции и что этот итерационный процесс должен быть остановлен.

Цитирование документов:

exception StopIteration

Вызывается встроенной функцией next() и методом итератора __next__(), чтобы сигнализировать о том, что итератор больше не создает элементов.

person code_dredd    schedule 29.11.2015