2013-11-26 47 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()读下一行。