我正在尝试使用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)
任何建议都会有用。谢谢
答案 0 :(得分:0)
我没有您的示例,因为我没有您的Pubmed ID列表。知道您要恢复的〜650K ID中有多少是很有意思的,如果要恢复639K标题(可能只是一些ID丢失)或10K,就不一样了。我自己尝试了一个迷你示例,它确实检索了标题。我认为某些ID可能无效。您可以尝试做较小的批次,并且:
此except: continue
将隐藏空句柄(如果查询结果为空)可能引起的任何问题。我会尝试检查异常。
如果len(record["PubmedArticle"])
小于批量大小,则发出警告。这样,您可以缩小可能丢失的ID的范围。
如果注册表中有title
字段,则仅将标题添加到Abstract
字典中。您确定所有记录都是这种情况吗?我尝试过的情况确实适用,但可能并非所有条目都具有此功能。