2016-11-04 1 views
0

Ich verwende BioPython, um eine CSV-Datei mit Daten über Zitate aus ihrem PubMed-Titel zu füllen. Ich habe dies bisher geschrieben:Durchsuchen von PubMed mit BioPython und Schreiben in 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]) 

jedoch erzeugt dies eine ungewöhnliche Ausgabe, wo die Titel, Abstract und MeSH Begriffe über mehrere Spalten verteilt sind und nicht getrennt, die nehme ich an ihrer Art zurückzuführen ist.(). Ich wünsche mir, dass meine CSV-Tabelle aus drei Spalten besteht, von denen die eine den Titel, die andere die Zusammenfassung und die andere die Netzbegriffe enthält.

Wie kann ich das erreichen?

Beispielausgabe

Um zu klären, die erste Spalte enthält den gesamten Titel, und der Beginn der abstrakten und die nächsten Spalten enthält nachfolgende Abschnitte des abstrakt. Ich benötige sie aufgeteilt in verschiedene Spalten. dh. Die erste Spalte sollte nur den Titel enthalten. Die Sekunde nur das Abstrakte, das dritte nur MeSH.

Derzeit ist die erste Spalte enthält:

"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

Was meinst du mit „dem Titel, Abstrakte und MeSH-Begriffe sind auf mehrere Spalten verteilt "? Können Sie uns eine Beispielausgabe zeigen? – larsks

+0

@Iarsks Habe es getan. – Toby

Antwort

0

Der Wert von record[0]['MedlineCitation']['Article']['Abstract'] ist ein Wörterbuch, das den abstrakten Text und eine kürzere Zusammenfassung enthält. Wenn Sie die tatsächliche abstrakt wollen, statt:

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

Sie benötigen:

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

Jetzt abstract eine einzelne Zeichenfolge enthält und sollte zum Schreiben in Ihrer CSV-Datei geeignet sein.

aktualisiert

Ich bin nicht in der Lage, den Fehler zu reproduzieren Sie in Ihrem Kommentar beschrieben haben, auch wenn die gleichen Eingangsdaten:

>>> 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

Ich habe das versucht, aber habe diesen Fehler: Traceback (letzter Aufruf zuletzt): Datei "/Users/.../Desktop/csvPubMed.py", Zeile 16, in abstract = Datensatz [0] ['MedlineCitation' ] ['Article'] ['Abstract'] ['AbstractText'] KeyError: 'Abstract' – Toby

+0

Dieser Fehler macht keinen Sinn, weil der Pfad 'record [0] ['MedlineCitation'] ['Article'] ['Abstract'] 'ist das, was du * bereits * in deinem Code verwendest. Wenn der Code, den Sie in Ihrer Frage gepostet haben, ohne Fehler läuft, sollten Sie diesen Fehler nicht mit meinem Code sehen (obwohl es denkbar ist, dass Sie einen Fehler bezüglich 'AbstractText' sehen würden, wenn Ihre Daten sich von denen unterscheiden, die ich verwendet habe). – larsks

+0

Die erste Spalte enthält noch Teile des Abstracts. – Toby

Verwandte Themen