2016-12-04 54 views
0

我目前正在研究一個項目,我需要從Pu​​bMed下載幾千條引文。我目前使用BioPython並寫了這個代碼:BioPython計數錯誤

from Bio import Entrez 
from Bio import Medline 
from pandas import * 
from sys import argv 
import os 

Entrez.email = "my_email" 
df = read_csv("my_file_path") 
i=0 

for index, row in df.iterrows(): 
    print (row.id) 
    handle = Entrez.efetch(db="pubmed",rettype="medline",retmode="text", id=row.id) 
    records = Medline.parse(handle) 
    for record in records: 
     try: 
      abstract = str(record["AB"]) 
     except: 
      abstract = "none" 
     try: 
      title = str(record["TI"]) 
     except: 
      title = "none" 
     try: 
      mesh = str(record["MH"]) 
     except: 
      mesh = "none" 
    path = 'my_file_path' 
    filename= str(row.id) + '.txt' 
    filename = os.path.join(path, filename) 
    file = open(filename, "w") 
    output = "title: "+str(title) + "\n\n" + "abstract: "+str(abstract) + "\n\n" + "mesh: "+str(mesh) + "\n\n" 
    file.write(output) 
    file.close() 
    print (i) 
    i=i+1 

不過,我收到時運行這些代碼以下錯誤:

Traceback (most recent call last): 
    File "my_file_path", line 13, in <module> 
    handle = Entrez.efetch(db="pubmed",rettype="medline",retmode="text", id=row.id) 
    File "/.../anaconda/lib/python3.5/site-packages/biopython-1.68-py3.5-macosx-10.6-x86_64.egg/Bio/Entrez/__init__.py", line 176, in efetch 
    if ids.count(",") >= 200: 
AttributeError: 'numpy.int64' object has no attribute 'count' 

下面是CSV文件的前幾列:

id 
10029645 
10073846 
10078088 
10080457 
10088066 
... 
+0

請編輯您的問題併發布您要轉換爲DF的CSV樣本 - 前5行左右應該沒問題。 – MattDMo

回答

1

你的錯誤是在

handle = Entrez.efetch(db="pubmed",rettype="medline",retmode="text", id=row.id) 

從文檔

ID

UID列表。無論是單一的UID或以逗號分隔的UID

From the examples I see的名單,id是一個字符串,而不是一個numpy.int64了大熊貓數據幀的。您應該將row.id轉換爲字符串