Очистить данные от PubMed
Я написал следующую функцию для извлечения данных из PubMed с помощью Entrez:
def getFromPubMed(id):
handle = Entrez.efetch(db="pubmed",rettype="medline",retmode="text", id=str(id))
records = Medline.parse(handle)
for record in records:
abstract = str(record["AB"])
mesh = str(record["MH"]).replace("'", "").replace("[", "").replace("]", "")
pmid = str(record["PMID"])
title = str(record["TI"]).replace("'", "").replace("[", "").replace("]", "")
pt = str(record["PT"]).replace("'", "").replace("[", "").replace("]", "")
au = str(record["AU"])
dp = str(record["DP"])
la = str(record["LA"])
pmc = str(record["PMC"])
si = str(record["SI"])
try:
doi=str(record["AID"])
except:
doi = str(record["SO"]).split('doi:',1)[1]
return pmid, title, abstract, au, mesh, doi, pt, la, pmc
Однако эта функция не всегда будет работать, поскольку не все записи MEDLINE содержат все поля. Например, этот PMID не содержит никаких заголовков MeSH.
Я мог бы обернуть каждый элемент оператором try-Кроме, например, для abstract
:
try:
abstract = str(record["AB"])
except:
abstract = ""
но это кажется неуклюжим способом реализовать это. Что является более элегантным решением?
2 ответа
Решение
Вы можете разделить действие по извлечению полей отдельным методом, выполнив что-то вроде следующего:
def get_record_attributes(record, attr_details):
attributes = {}
for attr_name, details in attr_details.items():
value = ""
try:
value = record[details["key"]]
for char in details["chars_to_remove"]:
value = value.replace(char, "")
except KeyError, AttributeError:
pass
attributes[attr_name] = value
return attributes
def getFromPubMed(id):
handle = Entrez.efetch(db="pubmed",rettype="medline",retmode="text", id=str(id))
records = Medline.parse(handle)
for record in records:
attr_details = {
"abstract" : {"key" : "AB"},
"mesh" : { "key" : "MH", "chars_to_remove" : "'[]"},
#...
"aid" : {"key" : "AB"},
"so" : {"key" : "SO"},
}
attributes = get_record_attributes(record, attr_details)
#...
2018-02-03 20:32