Очистить данные от 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)

       #...

Как насчет:

mesh = str(record["MH"] or '')

Поскольку пустой словарь FALSE как предполагает этот пост

Другие вопросы по тегам