从python中的fasta标题中的相应GI编号获取NCBI的入藏号

时间:2016-09-13 16:02:30

标签: python fasta ncbi genbank

我一直看到Genbank警告他们正在逐步取消GI编号并保存了一些fasta文件,我已按以下格式编辑了标题:

>SomeText_ginumber

我不知道从哪里开始这个但是有一种方法,理想情况下使用python,我可以从NCBI获得每个gi的相应登录号,并输出带有标题的文件,如下所示:

>SomeText_accessionnumber

这是文件格式的另一个例子:

>Desulfovibrio_fructosivorans_ferredoxin_492837709
MTKSVAPTVTIDGKVVPIEGERNLLELIRKVRIDLPTFCYHSELSVYGACRLCLVEVKNRGIMGAC
>Oxalobacteraceae_bacterium_AB_14_hypothetical_protein_522195384
MIKLTVNGIPVEVDEGATYLDAANKAGVHIPTLCYHPRFRSHAVCRMCLVHVAGSSRPQAACIGKA

修改/更新

from Bio import Entrez
from time import sleep
import sys
import re
Entrez.email = ''

seqs = open(sys.argv[1],"r")

for line in seqs:
    if line.startswith('>'):
        gi = re.findall("\d{5,}",line)
        matches = len(gi)
        #print(matches)
        if matches < 2:
            if gi:
                handle = Entrez.efetch(db="nucleotide", id=gi, retmode="xml")
                records = Entrez.read(handle)
                print(line[0:line.rfind('_') + 1] + records[0]['GBSeq_primary-accession'])
                sleep(1)
        elif matches >= 2:
             print("Error - More than one ginumber in header!")
             break
        else:
            seq=line.rstrip()
            print(seq)
    else:
        seq1=line.rstrip()
        print(seq1)

1 个答案:

答案 0 :(得分:1)

尝试使用BioPython

以下代码段可以帮助您入门。首先从标题中获取GI(下划线后标题的一部分),从GenBank获取数据,打印旧标题但是使用登录号,然后输入其余的输入序列,完成:)

这适用于您的两个示例,但可能会因更多数据(缺少GI等)而失败。此外,加入号码具有下划线,就像您的标题一样,以后会使解析复杂化。也许用其他东西替换下划线或添加另一个分隔符。

from Bio import Entrez
from time import sleep
Entrez.email = 'your@email'

seqs = """>Desulfovibrio_fructosivorans_ferredoxin_492837709
MTKSVAPTVTIDGKVVPIEGERNLLELIRKVRIDLPTFCYHSELSVYGACRLCLVEVKNRGIMGAC
>Oxalobacteraceae_bacterium_AB_14_hypothetical_protein_522195384
MIKLTVNGIPVEVDEGATYLDAANKAGVHIPTLCYHPRFRSHAVCRMCLVHVAGSSRPQAACIGKA"""


for line in seqs.splitlines():
    if line.startswith('>'):
        gi = line[line.rfind('_') + 1:]
        handle = Entrez.efetch(db="nucleotide", id=gi, retmode="xml")
        records = Entrez.read(handle)
        print(line[0:line.rfind('_') + 1] + records[0]['GBSeq_primary-accession'])
        sleep(1)
    else:
        print(line)