MeSH-ASCII-Format in Python parsen

English Deutsch

Ähnlich wie unser zuvor veröffentlichter UniProt-Parser bietet MeSH ein ASCII-Format, das sich leicht mit Python parsen lässt.

Genau wie der UniProt-Parser yielded diese Funktion MeSH-Einträge, die durch Dictionaries repräsentiert werden. Beispielcode ist am Ende der Datei enthalten.

mesh_parser.py
#!/usr/bin/env python3
"""
Ein einfacher Parser für das MeSH-ASCII-Format, wie es hier heruntergeladen werden kann:
ftp://nlmpubs.nlm.nih.gov/online/mesh/.asciimesh/d2015.bin

Eine Referenz zu MeSH-Headings (d.h. Keys in der resultierenden Map) findest du unter
https://www.nlm.nih.gov/mesh/meshhome.html

Ursprünglich veröffentlicht auf TechOverflow.net
"""
from collections import defaultdict

__author__ = "Uli Köhler"
__copyright__ = "Copyright 2015, Uli Köhler"
__license__ = "CC0 1.0 Universal"
__version__ = "1.0"

def readMeSH(fin):
    """
    Parst ein file-ähnliches Objekt und generiert MeSH-Objekte, d.h.
    Dictionaries mit einer Liste von Werten für jeden Qualifier.

    Beispiel: {"MH": ["Acetylcysteine"]}

    """
    currentEntry = None
    for line in fin:
        line = line.strip()
        if not line:
            continue
        # Neuen Datensatz verarbeiten. MeSH markiert dies explizit
        if line == "*NEWRECORD":
            # Alten Eintrag yielden, neuen initialisieren
            if currentEntry:
                yield currentEntry
            currentEntry = defaultdict(list)
            continue
        # Zeilenbeispiel: "MH = Acetylcysteine"
        key, _, value = line.partition(" = ")
        # An Werteliste anhängen
        currentEntry[key].append(value)
    # Wenn ein nicht-leerer Eintrag übrig ist, diesen yielden
    if currentEntry:
        yield currentEntry

if __name__ == "__main__":
    # Beispiel für die Verwendung von readMeSH()
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("file")
    args = parser.parse_args()
    with open(args.file, "r") as infile:
        # readMeSH() yielded MeSH-Objekte, d.h. Dictionaries
        for entry in readMeSH(infile):
            print(entry)

Check out similar posts by category: Bioinformatics, Python