使用bioentrez

时间:2019-12-09 06:38:12

标签: biopython

我正在尝试使用Pubmed ID(在名为“ ids”的列表中)存储在Pubmed中的某些文章的标题。大约有65万个Pubmed ID。该代码似乎可以正常工作,并且不会引发任何错误。但是代码只提取文章的一小部分,而不是全部。

以下是代码:

Entrez.email = "xyz@enginebio.com"

for i in range(0,len(ids),10000):

    if i%10000 == 0:   # for me to track the progress of the script
        print (i)

    idlist=ids[i:i+10000]
    handle = Entrez.efetch(db="pubmed", id=idlist, retmode="xml")

    try:
        record = Entrez.read(handle)
    except:
        continue

    title={}

    for j in range(len(record["PubmedArticle"])):

        pmid=record["PubmedArticle"][j]['MedlineCitation']['PMID'][:]
        if "Abstract" in record["PubmedArticle"][j]['MedlineCitation']['Article'].keys():
            title[pmid]=record["PubmedArticle"][j]['MedlineCitation']['Article']['ArticleTitle'].encode('ascii', 'ignore').decode('ascii')

    # save article titles
    subfile='article_titles_'+str(i)+'.txt'
    ar = pd.DataFrame.from_dict(title, orient="index")
    ar.to_csv(subfile,sep="\t",header=None)

任何建议都会有用。谢谢

1 个答案:

答案 0 :(得分:0)

我没有您的示例,因为我没有您的Pubmed ID列表。知道您要恢复的〜650K ID中有多少是很有意思的,如果要恢复639K标题(可能只是一些ID丢失)或10K,就不一样了。我自己尝试了一个迷你示例,它确实检索了标题。我认为某些ID可能无效。您可以尝试做较小的批次,并且:

  1. except: continue将隐藏空句柄(如果查询结果为空)可能引起的任何问题。我会尝试检查异常。

  2. 如果len(record["PubmedArticle"])小于批量大小,则发出警告。这样,您可以缩小可能丢失的ID的范围。

  3. 如果注册表中有title字段,则仅将标题添加到Abstract字典中。您确定所有记录都是这种情况吗?我尝试过的情况确实适用,但可能并非所有条目都具有此功能。