UniProt-Textformat in Python lesen

English Deutsch

Wie bei vielen anderen Datenbanken in der rechnergestützten Biologie sind die Downloads für die beliebte UniProt-Datenbank in einem eigenen Textformat verfügbar, das auf ExPASy dokumentiert ist.

Es ist sicherlich nicht schwierig, einen generischen Parser zu schreiben, und man kann BioPython verwenden, aber ich glaube, dass es oft einfacher ist, einen getesteten Parser zu verwenden, der nur Standardbibliotheken nutzt.

Dieser Code bietet einen einfach zu verwendenden, generatorbasierten Streaming-Parser, der die Datensätze in dictionary-ähnliche Objekte parst. Zeilenumbrüche innerhalb von Feldern werden immer beibehalten. Der Parser geht davon aus, dass die Datei UTF-8-kodiert ist.

read_uniprot.py
#!/usr/bin/env python3
"""
Ein einfacher Reader für das UniProt-Textformat, wie es auf
http://www.uniprot.org/downloads heruntergeladen werden kann
"""
import gzip
from collections import defaultdict

__author__ = "Uli Köhler"
__copyright__ = "Copyright 2014, Uli Koehler"
__license__ = "Apache License v2.0"
__version__ = "1.0"


def readUniprot(fin):
    """Parst ein file-ähnliches Objekt und generiert UniProt-Objekte"""
    lastKey = None  # Der zuletzt gefundene Key
    currentEntry = defaultdict(str)
    for line in fin:
        key = line[:2].decode("ascii")
        #Neuen Eintrag verarbeiten
        if key == "//":
            yield currentEntry
            currentEntry = defaultdict(str)
        #SQ-Feld hat keinen Zeilen-Header außer in der ersten Zeile
        if key == "  ":
            key = lastKey
        lastKey = key
        #Value SOLLTE ASCII sein, sonst nehmen wir UTF8 an
        value = line[5:].decode("utf-8")
        currentEntry[key] += value
    #Wenn ein nicht-leerer Eintrag übrig ist, diesen ausgeben
    if currentEntry:
        yield currentEntry

if __name__ == "__main__":
    #Beispiel für die Verwendung von readUniprot()
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("file")
    args = parser.parse_args()
    with gzip.open(args.file, "rb") as infile:
        #readUniprot() yielded alle Dokumente
        for uniprot in readUniprot(infile):
            print(uniprot)

Check out similar posts by category: Bioinformatics, Python