2013-07-27 4 views
0

У меня есть текстовый файл:Удаление конкретных строк из текстового файла

>E8|E2|E9D 
Football is a good game 
Its good for health 
you can play it every day 
>E8|E2|E10D 
Sequence unavailable 
>E8|E2|EKB 
Cricket 
>E87|E77|E10D 
Sequence unavailable 
>E27|E97|E10D 
Sequence unavailable 
>E8|E2|E9D 
Sequence unavailable 

Я написал следующий код для обнаружения Sequence unavailable из этого файла и удалить его:

with open('input.txt') as f1, open('output.txt', 'w') as f2,\ 
                open('temp_file','w') as f3: 
    lines = []  # store lines between two `>` in this list 
    for line in f1: 
     if line.startswith('>'): 
      if lines: 
       f3.writelines(lines) 
       lines = [line] 
      else: 
       lines.append(line) 
     elif line.rstrip('\n') == 'Sequence unavailable': 
      f2.writelines(lines + [line]) 
      lines = [] 
     else: 
      lines.append(line) 

    f3.writelines(lines) 

os.remove('input.txt') 
os.rename('temp_file', 'input.txt') 

Но то, что я на самом деле хочу что я удаляю все доступные последовательности для заданного вопроса (последний столбец строк >).

Например, даже если есть строки, следующие E9D, если есть другой вход для E9D с Sequence unavailable нет записей должны быть записаны в выходной файл:

input.txt

>E8|E2|E9D 
Football is a good game 
Its good for health 
you can play it every day 
>E8|E2|E10D 
Sequence unavailable 
>E8|E2|EKB 
Cricket 
>E87|E77|E10D 
Sequence unavailable 
>E27|E97|E10D 
Sequence unavailable 
>E8|E2|E9D 
Sequence unavailable 

выход. txt

>E8|E2|EKB 
Cricket 

У нас есть только вопрос EKB.

+0

Спасибо @Martijn Pieters, чтобы это было легко понять – Rocket

ответ

1
def get_name(line): 
    return line[1:].rsplit('|', 1)[-1].strip() 

with open('input.txt') as f, open('output.txt', 'w') as fout: 
    name = '' 

    # Phase 1: Find unavailable sequence 
    unavailable = set() 
    for line in f: 
     if line.startswith('>'): 
      name = get_name(line) 
     else: 
      if 'Sequence unavailable' in line: 
       unavailable.add(name) 

    # Phase 2: Filter avilable sequence 
    f.seek(0) 
    keep = False 
    for line in f: 
     if line.startswith('>'): 
      name = get_name(line) 
      keep = name not in unavailable 
     if keep: 
      fout.write(line) 
+0

Его не работали над моими фактическими данными, которые в большой форме, я пытаюсь вставить его здесь – Rocket

+0

Я редактирую в своем вопросе – Rocket

+0

@ Ангел, я обновил код , – falsetru

0

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

import fileinput 
import sys 

f=open('input.txt') 
line = f.readline() 
f.close() 
words = line.split() 
for word in words: 
    line = line.replace("Sequence unavailable","") 
    line = line.replace("\n","") 

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

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