具有太多入藏号的efetch

时间:2017-03-27 14:56:54

标签: python python-3.x bioinformatics biopython

我遇到以下脚本的问题。我试图提交110 000 NCBI登录IDS来恢复fasta序列,但我从未得到它们(猜测需要某种批量提交模式或不会获得所有序列)。我想我必须使用批处理模式,但不知道如何做到这一点? 这是我正在使用的脚本。

import sys
from Bio import Entrez
from Bio import SeqIO


#define email for entrez login
db           = "nuccore"
Entrez.email = "someone@email.com"

#load accessions from arguments
if len(sys.argv[1:]) > 1:
  accs = sys.argv[1:]
else: #load accesions from stdin  
  accs = [ l.strip() for l in sys.stdin if l.strip() ]
#fetch
sys.stderr.write( "Fetching %s entries from GenBank: %s\n" % (len(accs), ", ".join(accs[:10])))
for i,acc in enumerate(accs):
  try:
    sys.stderr.write( " %9i %s          \r" % (i+1,acc))  
    handle = Entrez.efetch(db=db, rettype="fasta", id=acc)
    seq_record = SeqIO.read(handle, "fasta")

    if (len(seq_record.seq) > 0):
      header = ">" + seq_record.description + " Len:" , len(seq_record.seq)
      print(",".join(str(x) for x in header))
      print(seq_record.seq)
  except:
    sys.stderr.write( "Error! Cannot fetch: %s        \n" % acc)

./acc2fasta.py 163345 303239 ......(最多110 000)。

实际上我使用cat acc_file | acc2fasta.py

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以将逗号分隔的ID列表提供给Entrez.efetch()。因此,在您的情况下,不要使用enumerate()进行循环,请尝试:

handle = Entrez.efetch(db=db, rettype="fasta", id=','.join(accs))
#                                                  ^ comma separated list of ids

如果你想要更小的批次,那么继续以类似的方式进行,但仍然循环并一次提交1000个元素。