根据单独文件中的条目从FASTA文件中提取序列
我有两个文件。
文件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中的 每个Accession ID创建一个条目,其中 键 为Accession
ID,并且 值 设置为1(这并不意味着该值确实很重要)在这种情况下)。接下来,我们查看 文件1,
然后再次查看该文件中的每一行。如果文件中的行以开头,>
那么我们知道它包含一个登录ID。我们将这一行并沿分割,|
因为每个具有Accession
ID的行在|
字符串中都会有一个。接下来,按照的指定进行分割的第一部分_splitline[0]
。我们accessorIDWithArrow[1:-1]
用来截断字符串中的第一个和最后一个字符,它们是>
前面的符号和后面的空白。此时,
accessorID
现在包含我们希望从 文件2 获得的格式的登录ID 。接下来,我们检查之前创建并填充的词典是否将此访问ID定义为键。如果是这样,我们立即将具有登录ID的行写入新文件
fasta_parsed.txt
,并将skip
‘flag’变量设置/重置为0
。然后,else
包含该if not skip
段的语句将允许与我们发现要打印到fasta_parsed.txt
文件的登录号关联的后续行。对于保藏ID从 文件1 不在字典中(未在发现 文件2
),我们没有行写入fasta_parsed.txt
和我们设置skip
标志为0。因此,直到另一个登录ID是在发现 文件1 中存在的
文件2 ,所有后续行都将被跳过。