我有两个文件。
文件 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()
简要说明这里发生了什么...accesionids.txt 是您的文件 2,而 fasta.txt 是您的文件 1。显然,您需要在代码中将这些文件名替换为您的实际文件名。
首先,我们创建一个字典(有时称为散列或关联数组),并为文件 2 中的每个登录 ID 创建一个条目,其中键是Accession ID 和 value 设置为 1(在这种情况下该值并不重要)。
接下来我们查看文件 1 并再次查看该文件中的每一行。如果文件中的行以 > 开头,那么我们就知道它包含一个 Accession ID。我们采用该行并将其沿 | 拆分,因为具有登录 ID 的每一行都将在字符串中包含一个 |。接下来,采用 _splitline[0] 指定的拆分的第一部分。我们使用 accessorIDWithArrow[1:-1] 截断字符串中的第一个和最后一个字符,即前面的 > 符号和后面的空格。
此时,accessorID 现在包含我们希望从文件 2 获得的格式的登录 ID。
接下来,我们检查我们之前创建和填充的字典是否将此 Accession ID 定义为键。如果是,我们立即将带有登录 ID 的行写入新文件 fasta_parsed.txt,并将 skip 'flag' 变量设置/重置为 0。包含 if not skip 段的 else 语句将允许与我们发现的登录 ID 关联的后续行被打印到 fasta_parsed.txt 文件。
对于字典中未找到的文件 1 的登录 ID(不在文件 2 中),我们不会将行写入 fasta_parsed.txt 并将 skip 标志设置为 0。因此,直到在 File 1 中找到另一个 Accession ID,该 ID 存在于 File 2 中,将跳过所有后续行。
