根据单独文件中的条目从FASTA文件中提取序列

时间:2013-03-12 02:24:33

标签: python biopython

我有两个文件。

文件1:带有基因序列的FASTA文件,格式如下:

>PITG_00002 | Phytophthora infestans T30-4 conserved hypothetical protein (426 nt)
ATGCATCGCTCGGGTTCCGCACGGAAAGCCCAAGGTCTGGGATTACGGGGTGGTGGTCGG
TTACACTTGGAATAACCTCGCAAATTCAGAATCTCTACAGGCTACGTTCGCGGATGGAAC
>PITG_00003 | Phytophthora infestans T30-4 protein kinase (297 nt)
ATGACGGCTGGGGTCGGTACGCCCTACTGGATCGCACCGGAGATTCTTGAAGGCAAACGG
TACACTGAGCAAGCGGATATTTACTCGTTCGGAGTGGTTTTATCCGAGCTGGACACGTGC
AAGATGCCGTTCTCTGACGTCGTTACGGCAGAGGGAAAGAAACCCAAACCAGTTCAGATC
>PITG_00004 | Phytophthora infestans T30-4 protein kinase, putative (1969 nt)
ATGCGCGTGTCTGGTCTCCTTTCAATTCTTGCAGCCACTTTGACCACGGCCCAAGACTAC

文件2:一个简单的文本文件,其中包含基因的登录标识。像这样。

PITG_00003
PITG_00005
PITG_00023

文件2中的每个条目都在文件1中的某个位置,但文件1中的每个条目都不在文件2中。我需要删除文件1中不在文件2中的所有条目。我觉得必须有某些东西在可以帮助我的biopython模块中,我只是不知道是什么。例如,我原本以为我可以使用SeqIO.parse函数从我的FASTA文件中提取加入,但这实际上只有两个加入号文件。我不知道如何有选择地提取其他文件中的加入。也许喜欢将文件2中的所有条目读入字典,然后将该条目与文件1中的匹配条目相关联,并使用SeqIO.parse提取整个序列......但我真的不知道....任何人都可以给我的帮助非常感谢!

1 个答案:

答案 0 :(得分:5)

试试这个:

f2 = open('accessionids.txt','r')
f1 = open('fasta.txt','r')
f3 = open('fasta_parsed.txt','w')

AI_DICT = {}
for line in f2:
    AI_DICT[line[:-1]] = 1

skip = 0
for line in f1:
    if line[0] == '>':
        _splitline = line.split('|')
        accessorIDWithArrow = _splitline[0]
        accessorID = accessorIDWithArrow[1:-1]
        # print accessorID
        if accessorID in AI_DICT:
            f3.write(line)
            skip = 0
        else:
            skip = 1
    else:
        if not skip:
            f3.write(line)

f1.close()
f2.close()
f3.close()

简要说明这里发生了什么...... accessionids.txt是您的文件2 ,而fasta.txt是您的文件1 。显然,您需要将这些文件名替换为代码中的实际文件名。

首先,我们创建一个字典(有时称为散列或关联数组),对于文件2 中的每个Accession ID,我们创建一个所在的条目入藏ID和设置为1(在这种情况下,值并不重要)。

接下来,我们查看文件1 ,然后再次查看该文件中的每一行。如果文件中的行以>开头,那么我们知道它包含一个入藏ID。我们接受该行并将其沿|拆分,因为具有入藏ID的每一行都将在字符串中包含|。接下来,按照_splitline[0]的指定进行拆分的第一部分。我们使用accessorIDWithArrow[1:-1]来删除字符串中的第一个和最后一个字符,前面是>符号,后面是空格。

此时,accessorID现在包含我们期望文件2 格式的入藏ID。

接下来,我们检查我们之前创建并填充的字典是否将此入藏ID定义为键。如果是,我们立即将具有入藏ID的行写入新文件fasta_parsed.txt,并设置/重置skip'标记'变量为0。然后,包含else段的if not skip语句将允许与我们发现打印到fasta_parsed.txt文件的Accession ID相关联的后续行。

对于词典中未找到的文件1 的入藏ID(不在文件2 中),我们不会将该行写入fasta_parsed.txt然后我们将skip标志设置为0.因此,在文件2 中存在文件1 中的另一个登录ID之前,将跳过所有后续行