2013-11-26 45 views
0

的多行字符串我想提取輸入文件中的字符串,如以下:的Python提取從字符串

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

線與「>」是一個標頭和下面的行是一個序列開始。

我想提取與報頭中的序列只能用strats「> 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() 

順便說一句,你可以使用調試器來識別什麼是錯的程序流程。如果您是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()讀下一行。