首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Biopython:如何下载NCBI中的所有肽序列(或与特定术语相关的所有记录)?

Biopython:如何下载NCBI中的所有肽序列(或与特定术语相关的所有记录)?
EN

Stack Overflow用户
提问于 2019-12-10 13:09:43
回答 1查看 444关注 0票数 1

我想以fasta格式下载NCBI蛋白质数据库中的所有肽序列(即>和肽名,后面跟着肽序列),我看到了一个描述肽是这里的网状术语,但我想不出如何将它合并。

我写了这个:

代码语言:javascript
复制
import Bio
from Bio import Entrez

Entrez.email = 'test@gmail.com'
handle = Entrez.esearch(db="protein", term="peptide")
record = handle.read()
out_handle = open('myfasta.fasta', 'w')
out_handle.write(record.rstrip('\n'))

但是它只打印出995个if,没有要归档的序列,我想知道是否有人能证明我哪里出错了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-10 14:31:31

请注意,在NCBI蛋白质数据库中搜索术语肽返回8187908次点击量。,所以请确保您确实希望下载所有这些命中的肽序列到一个大fasta文件中。

代码语言:javascript
复制
>>> from Bio import Entrez
>>> Entrez.email = 'test@gmail.com'
>>> handle = Entrez.esearch(db="protein", term="peptide")
>>> record = Entrez.read(handle)
>>> record["Count"]
'8187908'

Entrez.esearch返回的默认记录数为20,这是为了防止NCBI服务器超载。

代码语言:javascript
复制
>>> len(record["IdList"])
20

要获取记录的完整列表,请更改retmax参数:

代码语言:javascript
复制
>>> count = record["Count"]
>>> handle = Entrez.esearch(db="protein", term="peptide", retmax=count)
>>> record = Entrez.read(handle)
>>> len(record['IdList'])
8187908

下载所有记录的方法是使用Entrez.epost

来自BioPython教程第9.4章

EPost上载用于后续搜索策略的UI列表;有关更多信息,请参见EPost帮助页。它可以通过Bio.Entrez.epost()函数从Biopython获得。 为了给出一个有用的例子,假设您有一长串想要使用EFetch下载的is (可能是序列,也可能是引用--任何东西)。当您使用EFetch发出请求时,您的ID列表、数据库等都会被转换为发送到服务器的长URL。如果您的If列表很长,这个URL就会变长,而长URL可能会中断(例如,一些代理不能很好地处理)。 相反,您可以将其分为两个步骤,首先使用EPost上传ID列表(这在内部使用“HTML”,而不是使用“HTML”,以绕过冗长的URL问题)。有了历史记录支持,您就可以引用这个长长的ID列表,并使用EFetch下载相关数据。 ..。返回的XML包含两个重要字符串,QueryKey和WebEnv,它们一起定义历史会话。您将提取这些值,以便与另一个Entrez调用(如EFetch )一起使用。

阅读9.15章。:使用历史搜索和下载序列,学习如何使用QueryKeyWebEnv

然后,一个完整的例子是:

代码语言:javascript
复制
from Bio import Entrez
import time
from urllib.error import HTTPError

DB = "protein"
QUERY = "peptide"

Entrez.email = 'test@gmail.com'
handle = Entrez.esearch(db=DB, term=QUERY, rettype='fasta')
record = Entrez.read(handle)

count = record['Count']
handle = Entrez.esearch(db=DB, term=QUERY, retmax=count, rettype='fasta')
record = Entrez.read(handle)

id_list = record['IdList']
post_xml = Entrez.epost(DB, id=",".join(id_list))
search_results = Entrez.read(post_xml)

webenv = search_results['WebEnv']
query_key = search_results['QueryKey']


batch_size = 200
with open('peptides.fasta', 'w') as out_handle:
    for start in range(0, count, batch_size):
        end = min(count, start+batch_size)
        print(f"Going to download record {start+1} to {end}")
        attempt = 0
        success = False
        while attempt < 3 and not success:
            attempt += 1
            try:
                fetch_handle = Entrez.efetch(db=DB, rettype='fasta',
                                             retstart=start, retmax=batch_size,
                                             webenv=webenv, query_key=query_key)
                success = True
            except HTTPError as err:
                if 500 <= err.code <= 599:
                    print(f"Received error from server {err}")
                    print(f"Attempt {attempt} of 3")
                    time.sleep(15)
                else:
                    raise
        data = fetch_handle.read()
        fetch_handle.close()
        out_handle.write(data)

然后,peptides.fasta的前几行如下所示:

代码语言:javascript
复制
>QGT67293.1 RepA leader peptide Tap (plasmid) [Klebsiella pneumoniae]
MLRKLQAQFLCHSLLLCNISAGSGD

>QGT67288.1 RepA leader peptide Tap (plasmid) [Klebsiella pneumoniae]
MLRKLQAQFLCHSLLLCNISAGSGD

>QGT67085.1 thr operon leader peptide [Klebsiella pneumoniae]
MNRIGMITTIITTTITTGNGAG

>QGT67083.1 leu operon leader peptide [Klebsiella pneumoniae]
MIRTARITSLLLLNACHLRGRLLGDVQR

>QGT67062.1 peptide antibiotic transporter SbmA [Klebsiella pneumoniae]
MFKSFFPKPGPFFISAFIWSMLAVIFWQAGGGDWLLRVTGASQNVAISAARFWSLNYLVFYAYYLFCVGV
FALFWFVYCPHRWQYWSILGTSLIIFVTWFLVEVGVAINAWYAPFYDLIQSALATPHKVSINQFYQEIGV
FLGIAIIAVIIGVMNNFFVSHYVFRWRTAMNEHYMAHWQHLRHIEGAAQRVQEDTMRFASTLEDMGVSFI
NAVMTLIAFLPVLVTLSEHVPDLPIVGHLPYGLVIAAIVWSLMGTGLLAVVGIKLPGLEFKNQRVEAAYR
KELVYGEDDETRATPPTVRELFRAVRRNYFRLYFHYMYFNIARILYLQVDNVFGLFLLFPSIVAGTITLG
LMTQITNVFGQVRGSFQYLISSWTTLVELMSIYKRLRSFERELDGKPLQEAIPTLR
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59267992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档