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

Python 根据单独文件中的条目从FASTA文件中提取序列,python,biopython,Python,Biopython,我有两个文件 文件1:包含基因序列的FASTA文件,格式如下所示: >PITG_00002 | Phytophthora infestans T30-4 conserved hypothetical protein (426 nt) ATGCATCGCTCGGGTTCCGCACGGAAAGCCCAAGGTCTGGGATTACGGGGTGGTGGTCGG TTACACTTGGAATAACCTCGCAAATTCAGAATCTCTACAGGCTACGTTCGCGGATGGAAC >PITG

我有两个文件

文件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
提取整个序列……但我真的不知道……任何人能给我的帮助都非常感谢

试试这个:

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中的每个登录ID创建一个条目,其中键是登录ID,值设置为1(在这种情况下,值并不重要)

接下来,我们查看文件1,再次查看该文件中的每一行。如果文件中的行以
开头,那么我们知道它包含一个登录ID。我们将该行沿着
|
拆分,因为每个具有登录ID的行在字符串中都有一个
|
。接下来,按照
\u splitline[0]
的指定,获取拆分的第一部分。我们使用带有箭头[1:-1]的
附件切掉字符串中的第一个和最后一个字符,即前面的
符号和后面的空白

此时,
accessorID
现在以我们从文件2期望的格式包含登录ID

接下来,我们检查我们之前创建和填充的字典是否将该登录ID定义为密钥。如果是这样,我们立即将带有登录ID的行写入一个新文件,
fasta_parsed.txt
,并将
skip
“flag”变量设置/重置为
0
。包含
if not skip
段的
else
语句将允许与我们发现的登录ID相关联的后续行被打印到
fasta_parsed.txt
文件中

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

尝试以下操作:

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中的每个登录ID创建一个条目,其中键是登录ID,值设置为1(在这种情况下,值并不重要)

接下来,我们查看文件1,再次查看该文件中的每一行。如果文件中的行以
开头,那么我们知道它包含一个登录ID。我们将该行沿着
|
拆分,因为每个具有登录ID的行在字符串中都有一个
|
。接下来,按照
\u splitline[0]
的指定,获取拆分的第一部分。我们使用带有箭头[1:-1]
附件切掉字符串中的第一个和最后一个字符,即前面的
符号和后面的空白

此时,
accessorID
现在以我们从文件2期望的格式包含登录ID

接下来,我们检查我们之前创建和填充的字典是否将该登录ID定义为密钥。如果是这样,我们立即将带有登录ID的行写入一个新文件,
fasta_parsed.txt
,并将
skip
“flag”变量设置/重置为
0
。包含
if not skip
段的
else
语句将允许与我们发现的登录ID相关联的后续行被打印到
fasta_parsed.txt
文件中


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

非常感谢。我刚刚意识到我的文件中有很多无关的序列,它把我正在运行的程序搞砸了。您的贡献是无价的,特别是您对代码的解释。非常感谢。我刚刚意识到我的文件中有很多无关的序列,它把我正在运行的程序搞砸了。您的贡献是无价的,尤其是您对代码的解释。