2015-11-29 6 views
1

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

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(), но получил тот же результат и ошибку «stop iteration».

+0

Пожалуйста, не забудьте вернуться и принять ответ, который вы нашли наиболее полезным для вас. Это принесет вам пользу, те, кто пытается ответить на ваш вопрос, и сообщество в целом. Вот как мы говорим «спасибо» здесь. – ray

ответ

0

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

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

Примечание: эти линии

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

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

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

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

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

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

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, чтобы сигнализировать, что они не могут производить больше элементов из повторяющейся коллекции и что этот процесс итерации должен прекратиться.

Цитирование the docs:

exception StopIteration

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

 Смежные вопросы

  • Нет связанных вопросов^_^