我遇到以下脚本的问题。我试图提交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
感谢您的帮助。
答案 0 :(得分:0)
您可以将逗号分隔的ID列表提供给Entrez.efetch()
。因此,在您的情况下,不要使用enumerate()
进行循环,请尝试:
handle = Entrez.efetch(db=db, rettype="fasta", id=','.join(accs))
# ^ comma separated list of ids
如果你想要更小的批次,那么继续以类似的方式进行,但仍然循环并一次提交1000个元素。