我有一个包含多个序列的fasta文件,其标题如下所示:
>1016BSA34080.1
MTHSVRIITVTVNFLQHRFFIDYMSEIGLLDGEIEQMVSALQEQVHIVARARTLPEMKNLERDTHVIVKT
LKKQLTAFHSEVKKIADSTQRSRYEGKHQTYEAKVKDLEKELRTQIDPPPKSVSEKHMEDLMGEGGPDGS
GFKTTDQVLRAGIRIQNDA
>1038BSA81955.1
MQQQQARRRMEEPTAAAATASSTTSFAAQPLLSRSVAPQAASSPQASARLAESAGFRSAAVFGSAQAAVG
GRGRGGFGAPPGRGGFGAPPAAGFGAAPAFGAPPTLQAFSAAPAPGGFGAPPAPQGFGAPRAAGFGAPPA
PQAFSAVAPASSTAIPLDVTTYLGDTFGSAPTRGPP
标题开头的4位数字是序列的唯一ID。
你能帮我写一个python脚本来提取4位数的序列(在每行一个ID的文本文件中)吗?
我尝试修改此脚本(我在此网站上找到:Extract sequences from a FASTA file based on entries in a separate file)以符合我的目的(徒劳):
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()
我是Python新手,非常感谢任何帮助!谢谢-Divya
答案 0 :(得分:1)
accessionids.txt
是否仅包含四位数代码?
如果是,请将accessorID更改为:
accessorID = accessorIDWithArrow[1:5]
使这更像Pythonic的一些方法是:
对AI_DICT使用集合而不是字典,使用strip()
而不是切片来删除换行符,并使用生成器表达式来构建集合
AI_SET = set((line.strip() for line in f2))
True
使用False
和skip
而不是0和1。
我会重做主循环:
in_accession_ids = False
for line in f1:
if line[0] == '>':
_splitline = line.split('|')
accessorIDWithArrow = _splitline[0]
accessorID = accessorIDWithArrow[1:5]
# print accessorID
in_accession_ids = accessorID in AI_SET
if in_accession_ids:
f3.write(line)
我认为这种逻辑更加明显。此外,从原始版本中的skip = 0
或我的in_accession_ids=True
开始,意味着您在查找第一个序列标题之前打印所有内容。这可能是你想要的,也许不是 - 我假设不在我的重写中。
你可能最终想要查看Biopython集合 - 这对于这个特定的任务来说太过分了,但总的来说相当不错。除了其他方面,还有许多用于阅读FASTA文件和相关格式的工具。
答案 1 :(得分:1)
使用Biopython,您可以这样做(需要安装biopyhton):
from Bio import SeqIO
f1 = "fasta.fa"
f2 = "accessionids.txt"
f3 = "selected_seqs.fa"
selected_seqs = list()
with open(f2, "r") as seq_ids:
accessionids = [line.rstrip("\n") for line in seq_ids]
for seq_record in SeqIO.parse(f1, "fasta")
header = seq_record.name # (or .id or so)
for accession_id in accessionids:
if accession_id == header[0:4]:
selected_seqs.append(seq_record)
SeqIO.write(selected_seqs, f3, "fasta")
这将遍历您的序列记录(fasta文件),并针对每个条目检查是否存在与accessionids文件中的id相匹配的内容。
注意:
if accession_id in header: