2013-11-26 6 views
0

Я хотел бы, чтобы извлечь строки из входного файла, как показано ниже:Python Извлечение строк из нескольких строк строк

>a11 
UCUUUGGUUAUCUAGCUGUAUGA 
>a11 
UCUUUGGUUAUCUAGCUGUAUGA 
>b22 
UGGUCGACCAGUUGGAAAGUAAU 
>b22 
ACUUCACCUGGUCCACUAGCCGU 
>b22 
AGGUUGUCUGUGAUGAGUUCG 
>t33 
UUAAUGCUAAUCGUGAUAGGGGU 
>t33 
CAGUAACAAAGAUUCAUCCUUGU 

Линия начинается с «>» это заголовок и ниже линии последовательности.

Я хотел бы, чтобы извлечь последовательности с заголовком страта только с «> b22»

Это мой код, который не дает properl ответа.

def extractData(): 
    filename = ("data.txt") 
    infile = open(filename,'r') 

    for x in infile.readlines(): 
     x = x.strip() 
     if x.startswith(">"): 
      header = x 
     else: 
      sequence = x 
     if header.startswith(">b22"): 
      print(header, sequence) 
    infile.close() 

extractData() 

Это дает результат:

>b22 UCUUUGGUUAUCUAGCUGUAUGA 
>b22 UGGUCGACCAGUUGGAAAGUAAU 
>b22 UGGUCGACCAGUUGGAAAGUAAU 
>b22 ACUUCACCUGGUCCACUAGCCGU 
>b22 ACUUCACCUGGUCCACUAGCCGU 
>b22 AGGUUGUCUGUGAUGAGUUCG 

Но, мой ожидаемый результат таков:

>b22 UGGUCGACCAGUUGGAAAGUAAU 
>b22 ACUUCACCUGGUCCACUAGCCGU 
>b22 AGGUUGUCUGUGAUGAGUUCG 

Может кто-нибудь исправить это, пожалуйста? В чем дело и что я должен понимать, чтобы получить правильный результат?

ответ

2

Незначительные изменения в коде:

def extractData(): 
    filename = ("data.txt") 
    infile = open(filename,'r') 

    for x in infile.readlines(): 
     x = x.strip() 
     if x.startswith(">"): 
      header = x 
     else: 
      sequence = x 
      if header.startswith(">b22"): 
       print(header, sequence) 
       header = '' 


    infile.close() 

extractData() 

Btw, вы можете использовать отладчик, чтобы определить, что является неправильным с потоком программы. Если вы новичок в Python, я бы рекомендовал использовать Eclipse с плагином Pydev для интерактивной отладки. Link for Tutorial on Pydev in Eclipse

Сказав это, проблема возникает из-за того, что if header.startswith(">b22") оценивается для каждой строки, проанализированной из файла. Когда вы перемещаете его внутри блока else, он будет оцениваться только после того, как вы закончите синтаксический анализ (и он не будет оценивать строки header, очевидно).

+0

Отлично, но он не работает с строкой 'header = '''. Если я его уничтожу, тогда это сработает. Зачем давать нулевой заголовок? Спасибо @chandan – Karyo

+0

исправил проблему. как только заголовок использовался с последовательностью, то есть «print (header, sequence)», тогда должно быть безопасно установить его в пустую строку. – Chandan

1

Вот другой подход:

>>> with open('data.txt') as f: 
...  for line in f: 
...   if line.startswith('>b22'): 
...    print('{0} {1}'.format(line.strip(), next(f).strip())) 
... 
>b22 UGGUCGACCAGUUGGAAAGUAAU 
>b22 ACUUCACCUGGUCCACUAGCCGU 
>b22 AGGUUGUCUGUGAUGAGUUCG 

Поскольку файл может повторяться снова, когда вы достигнете линии с >b22, вы можете использовать next() прочитать следующую строку.

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