2016-11-04 98 views
0

我使用BioPython来填充CSV文件中关于引用来自PubMed标题的数据。到目前为止,我写了这个:使用BioPython搜索PubMed并写入CSV

import csv 
from Bio import Entrez 
import bs4 

Entrez.email = "my_email" 
CSVfile = open('srData.csv') 
fileReader = csv.reader(CSVfile) 
Data = list(fileReader) 

with open('blank.csv','w') as f1: 
    writer=csv.writer(f1, delimiter='\t',lineterminator='\n',) 
    for id in Data: 
    handle = Entrez.efetch(db="pubmed", id=id, rettype="gb", retmode="xml") 
    record = Entrez.read(handle) 
    title=record[0]['MedlineCitation']['Article']['ArticleTitle'] 
    abstract=record[0]['MedlineCitation']['Article']['Abstract'] 
    mesh =record[0]['MedlineCitation']['MeshHeadingList'] 
    descriptors = ','.join(term['DescriptorName'] for term in mesh) 
    writer.writerow([title, abstract, descriptors]) 

然而,这样会产生一个不寻常的输出,其中的标题,摘要和主题词分布在多个列传播,而不是分开的,我推测是由于它们的类型。 ()。我希望我的csv表由三列组成,一列包含标题,另一列包含摘要,另一列包含网格术语。

我该如何做到这一点?

样本输出

为了澄清,第一列包含整个标题和摘要和未来数列的开头包含抽象的后续部分。我要求他们分裂成不同的专栏。即。第一列应该只包含标题。第二只是抽象的,第三只是MeSH条款。

目前,第一列包含:

"Distinct and combined vascular effects of ACE blockade and HMG-CoA reductase inhibition in hypertensive subjects. {u'AbstractText': ['Hypercholesterolemia and hypertension are frequently associated with elevated sympathetic activity. Both are independent cardiovascular risk factors and both affect endothelium-mediated vasodilation. To identify the effects of cholesterol-lowering and antihypertensive treatments on vascular reactivity and vasodilative capacity" 
+0

你是什么意思“称号的意思是,抽象和MeSH术语分布在多个列“?你能向我们展示一些样本输出吗? – larsks

+0

@Iarsks已经这样做了。 – Toby

回答

0

record[0]['MedlineCitation']['Article']['Abstract']的值是一个包含抽象的文字和更短的总结一本字典。如果你想实际的抽象的而是:

abstract=record[0]['MedlineCitation']['Article']['Abstract'] 

您需要:

abstract=record[0]['MedlineCitation']['Article']['Abstract']['AbstractText'][0] 

现在abstract包含一个字符串,应该是适合写您的CSV文件。

更新

我无法重现您在您的评论所描述的错误,使用相同的输入数据,即使:

>>> from Bio import Entrez 
>>> Entrez.email = '...' 
>>> id=10067800 
>>> handle = Entrez.efetch(db="pubmed", id=id, rettype="gb", retmode="xml") 
>>> record = Entrez.read(handle) 
>>> abstract=record[0]['MedlineCitation']['Article']['Abstract']['AbstractText'][0] 
>>> abstract 
StringElement('To assess the antihypertensive efficacy and safety of the novel AT1 receptor antagonist, telmisartan, compared with that of enalapril in elderly patients with mild to moderate hypertension.', attributes={u'NlmCategory': u'OBJECTIVE', u'Label': u'OBJECTIVE'}) 
>>> 
+0

我试过这个,但得到这个错误:Traceback(最近调用最后一次): 文件“/Users/.../Desktop/csvPubMed.py”,第16行,在 abstract = record [0] ['MedlineCitation' ] ['Article'] ['Abstract'] ['AbstractText'] KeyError:'Abstract' – Toby

+0

该错误没有任何意义,因为路径'record [0] ['MedlineCitation'] ['Article'] ['Abstract']'就是你已经*在你的代码中使用的。如果您在问题中发布的代码运行时没有错误,那么您不应该在我的代码中看到该错误(尽管如果您的数据与我使用的数据不同,您可能会发现关于“AbstractText”的错误)。 – larsks

+0

第一列仍包含摘要的部分内容。 – Toby