2016-10-10 69 views
1

我正在開發一個項目,該項目需要我使用Excel電子表格的輸入和結果的打印計數來搜索pubmed。我一直在使用xlrdentrez來完成這項工作。這是我嘗試過的。XLRD/Entrez:搜索Pubmed並提取計數

  1. 我需要使用的作者,他/她的醫療學校,一系列的歲月,和他/她的導師的名字,這些都是在Excel電子表格的名稱通過pubmed進行搜索。我已經使用xlrd將所需信息的每個列轉換爲字符串列表。

    from xlrd import open_workbook 
    book = xlrd.open_workbook("HEENT.xlsx").sheet_by_index(0) 
    med_name = [] 
    for row in sheet.col(2): 
        med_name.append(row) 
    med_school = [] 
    for row in sheet.col(3): 
        med_school.append(row) 
    mentor = [] 
    for row in sheet.col(9): 
        mentor.append(row) 
    
  2. 我設法使用Entrez打印我的特定查詢的計數。

    from Bio import Entrez 
    Entrez.email = "[email protected]" 
    handle = Entrez.egquery(term="Jennifer Runch AND ((2012[Date - Publication] : 2017[Date - Publication])) ") 
    handle_1 = Entrez.egquery(term = "Jennifer Runch AND ((2012[Date - Publication] : 2017[Date - Publication])) AND Leoard P. Byk") 
    handle_2 = Entrez.egquery(term = "Jennifer Runch AND ((2012[Date - Publication] : 2017[Date - Publication])) AND Southern Illinois University School of Medicine") 
    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.append(row["Count"]) 
    
    for row in record_1["eGQueryResult"]: 
        if row["DbName"] == "pubmed": 
         pubmed_count.append(row["Count"]) 
    
    for row in record_2["eGQueryResult"]: 
        if row["DbName"] == "pubmed": 
         pubmed_count.append(row["Count"]) 
    print(pubmed_count) 
    >>>['3', '0', '0'] 
    

    的問題是,我需要在學生姓名列表(「med_name」)的下一個學生的名字來代替學生的名字(「詹妮弗藍籌」),該醫學院與下一個學校,當前指導者的名字與列表中下一個指導者的名字。

我想說出我的電子郵件pubmed後,我應該寫一個for循環,但我不知道如何代碼的兩個塊連接在一起。有誰知道連接兩個代碼塊的有效方法,或者知道如何以比我嘗試的更有效的方式來做到這一點? 謝謝!

+0

問題仍然存在? –

+0

@MaximilianPeters我有一些後續問題關於這一個,我發佈到另一個線程:http://stackoverflow.com/questions/40161460/searching-on-pubmed-using-biopython –

回答

1

你得到了大部分的代碼。它只是需要稍微修改。

假設你的表是這樣的:

Jennifer Bunch |Southern Illinois University School of Medicine|Leonard P. Rybak 
Philipp Robinson|Stanford University School of Medicine   |Roger Kornberg 

,你可以使用下面的代碼

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) 

輸出


['3', '0', '0'] 
['1', '0', '0'] 

所需的修改是爲了查詢使用變量。

其他一些修改這是沒有必要的,但可能會有所幫助:

  • 環比Excel紙只有一次
  • pubmed_count在一個預定義的列表,因爲如果值回來空,的大小輸出會有所不同,這使得很難猜測哪個值屬於哪個查詢
  • 所有事情都可能被進一步優化和優化,例如將查詢存儲在一個列表中並循環遍歷它們,這會減少代碼的重複次數,但現在它完成了這項工作。