在Fasta数据集中搜索可变氨基酸基序

时间:2019-04-30 17:09:15

标签: python biopython

我需要找出我的数据集中哪些蛋白质是该氨基酸基序:PoXGXXHyXHy。我使用的是biopython和python 2.7,但我不是完全的生物信息学家,因此遇到了麻烦。我该如何制作seq_record + 1之类的东西?我尝试在范围内使用,但在SeqIO.parse中不起作用。好吧,我现在陷入了混乱,请有人帮忙吗?我会非常感激。

from Bio import SeqIO

print('enter the path to your fasta file: ' )
user_input = raw_input()

for seq_record in SeqIO.parse(user_input, "fasta"):

    aminoacids_count = len(seq_record)
    seq_record_trimmed = seq_record[aminoacids_count//2:aminoacids_count + 1]

    if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' in seq_record_trimmed:
        if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' or 'C' or 'U' or 'G' or 'P' or 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'Y' or 'W' in seq_record_trimmed:
           if 'G' in seq_record_trimmed:
              if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' or 'C' or 'U' or 'G' or 'P' or 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'Y' or 'W' in seq_record_trimmed:
                if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' or 'C' or 'U' or 'G' or 'P' or 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'Y' or 'W' in seq_record_trimmed:
                    if 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'W' or 'Y' in seq_record_trimmed:
                        if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' or 'C' or 'U' or 'G' or 'P' or 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'Y' or 'W' in seq_record_trimmed:
                            if 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'W' or 'Y' in seq_record_trimmed:
                                print(seq_record.id)
                                continue
                            else:
                                break
                        else:
                            break
                    else:
                        break                                      
                else:
                    break                                  
            else:
                break                     
        else:
            break
    else:
        break
else:
    print(seq_record.id + 'No B_signal has been found')

1 个答案:

答案 0 :(得分:0)

那是行不通的。您最好使用一些正则表达式。

from Bio import SeqIO
import re

print('enter the path to your fasta file: ' )
user_input = raw_input()    

Po = '[RHKDESTNQ]'
Hy = '[AVILMFWY]'
X = '.'

motif_pattern = Po + X + 'G' + X + X + Hy + X + Hy
motif_regex = re.compile(motif_pattern)

for seq_record in SeqIO.parse(user_input, "fasta"):

    aminoacids_count = len(seq_record)
    seq_record_trimmed = seq_record[aminoacids_count//2:aminoacids_count + 1]
    seq_str = str(seq_record_trimmed.seq)

    if motif_regex.search(seq_str):
        print(seq_record_trimmed.id)

str(seq_record_trimmed.seq)将序列转换为普通字符串。在此之前,Seq 对象并不具有字符串的所有功能,例如正则表达式搜索。

regex本身就是一个全新的主题,与Python无关:可以在大多数编程语言中找到它。您可以在线找到有关它的说明。您可以在regex101.com上使用正则表达式。

下一步:'R' or 'H' in seq_record将无法正常工作。无论seq_record可能是什么,它将始终返回True。您想要的是'R' in seq_record or 'H' in seq_record,或者,如果您不想重复seq_record:any(p in seq_record for p in 'RH')

最后:您控制的流程(如果/其他/中断/继续)看起来很糟糕,并且没有按照您的意图进行。您应该阅读有关如何正确编写的更多信息。

祝你好运。