1

我有两个文件。

文件 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提取整个序列......但我真的不知道......任何人都可以提供的帮助我非常感激!

4

1 回答 1

6

尝试这个:

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是你的File 2,而fasta.txt你的File 1。显然,您需要用代码中的实际文件名替换这些文件名。

首先,我们创建一个字典(有时称为散列或关联数组),并为文件 2中的每个登录 ID创建一个条目,其中是登录 ID,设置为 1(不是该值真正重要在这种情况下)。

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

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

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

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

于 2013-03-12T02:48:22.450 回答