使用BioPython搜索PubMed并写入CSV

2024-04-19 05:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用BioPython来填充一个CSV文件,其中包含他们的publimed标题中的引文。到目前为止,我已经写了:

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术语。在

我怎样才能做到这一点?在

样本输出

为了澄清,第一列包含整个标题,摘要的开头和后面几列包含摘要的后续部分。我要求把它们分成不同的列。第一列只应包含标题。第二个是抽象的,第三个是网状的。在

目前,第一列包含:

^{pr2}$

Tags: csvcsvfileimportid标题dataemailentrez
1条回答
网友
1楼 · 发布于 2024-04-19 05:25:26

record[0]['MedlineCitation']['Article']['Abstract']的值是一个包含摘要文本和较短摘要的字典。如果你想要的是真正的摘要,而不是:

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

您需要:

^{pr2}$

现在,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'})
>>> 

相关问题 更多 >