首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XLRD/ Entrez:通过Pubmed搜索并提取计数

XLRD/ Entrez:通过Pubmed搜索并提取计数
EN

Stack Overflow用户
提问于 2016-10-10 23:46:09
回答 1查看 355关注 0票数 1

我正在进行一个项目,它要求我使用来自pubmed电子表格的输入和结果的打印计数来搜索Excel。我一直在使用xlrdentrez来完成这项工作。这是我尝试过的。

  1. 我需要使用作者的名字、他/她的医学院、一系列年以及他/她的导师的名字搜索pubmed,这些都在Excel电子表格中。我使用xlrd将包含所需信息的每一列转换为字符串列表。 从xlrd导入open_workbook book =open_workbook med_name = [] sheet.col(2)中的行:med_name.append(行) med_school = []用于sheet.col(3)中的行:med_school.append(行) for = []用于sheet.col(9)中的行:mentor.append(行)
  2. 我已经成功地使用Entrez打印了特定查询的计数。 来自Bio import Entrez Entrez.email = "your@email.edu“handle = Entrez.egquery(term="Jennifer和(2012Date-出版物: 2017Date -出版) ") handle_1 = Entrez.egquery(term = "Jennifer AND (2012Date-出版物: 2017Date -出版物)”和LeoardP.Byk) handle_2 = Entrez.egquery(term = "Jennifer“((2012Date -出版物: 2017Date -出版))handle_1= Entrez.read(handle) record_1 =Entrez。阅读(Handle_1) record_2 = Entrez.read(handle_2) pubmed_count = []表示记录中的行“eGQueryResult”:if row"DbName“== "pubmed":pubmed_count.append(行”Count“)表示record_1"eGQueryResult":if row"DbName”== "pubmed":pubmed_count.append(行“Count”)表示record_2“eGQueryResult”中的行: if row"DbName“== "pubmed”":pubmed_count.append(行“计数”)打印(Pubmed_count)>‘3’>,'0','0‘ 问题是,我需要将学生名("Jennifer“)替换为学生名字列表中的下一个学生名(”med_name“),将医学院替换为下一所学校,将当前导师的名字替换为下一位导师的名字。

我认为我应该在向pubmed声明我的电子邮件之后编写一个for循环,但是我不知道如何将这两个代码块连接在一起。有没有人知道连接这两个代码块的有效方法,或者知道如何用比我尝试过的方法更有效的方法来实现这一点?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-10-11 07:39:08

你已经把大部分代码都准备好了。只是需要稍微修改一下。

假设您的桌子看起来像这样:

代码语言:javascript
复制
Jennifer Bunch  |Southern Illinois University School of Medicine|Leonard P. Rybak
Philipp Robinson|Stanford University School of Medicine         |Roger Kornberg

您可以使用以下代码

代码语言:javascript
复制
import xlrd
from Bio import Entrez
sheet = xlrd.open_workbook("HEENT.xlsx").sheet_by_index(0)

med_name = list()
med_school = list()
mentor = list()
search_terms = list()
for row in range(0, sheet.nrows):
    search_terms.append([sheet.cell_value(row, 0), sheet.cell_value(row,1), sheet.cell_value(row, 2)])

pubmed_counts = list()

for search_term in search_terms:
    handle = Entrez.egquery(term="{0} AND ((2012[Date - Publication] : 2017[Date - Publication])) ".format(search_term[0]))
    handle_1 = Entrez.egquery(term = "{0} AND ((2012[Date - Publication] : 2017[Date - Publication])) AND {1}".format(search_term[0], search_term[2]))
    handle_2 = Entrez.egquery(term = "{0} AND ((2012[Date - Publication] : 2017[Date - Publication])) AND {1}".format(search_term[0], search_term[1]))
    record = Entrez.read(handle)
    record_1 = Entrez.read(handle_1)
    record_2 = Entrez.read(handle_2)

    pubmed_count = ['', '', '']

    for row in record["eGQueryResult"]:
        if row["DbName"] == "pubmed":
            pubmed_count[0] = row["Count"]
    for row in record_1["eGQueryResult"]:
        if row["DbName"] == "pubmed":
            pubmed_count[1] = row["Count"]
    for row in record_2["eGQueryResult"]:
        if row["DbName"] == "pubmed":
            pubmed_count[2] = row["Count"]

    print(pubmed_count)
    pubmed_counts.append(pubmed_count)

输出

代码语言:javascript
复制
['3', '0', '0']
['1', '0', '0']

所需的修改是使用格式化使查询变量。

一些没有必要但可能有帮助的其他修改:

  • 只在Excel表上循环一次
  • pubmed_count存储在预定义列表中,因为如果值返回为空,则输出的大小将不同,因此很难猜测哪个值属于哪个查询。
  • 一切都可以进一步优化和修饰,例如,将查询存储在一个列表中并循环它们,这样可以减少代码的重复,但现在它完成了工作。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39968425

复制
相关文章

相似问题

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