Frage

GEDCOM ist ein Standard für die genealogischen Daten auszutauschen.

Ich habe Parser geschrieben in

gefunden

aber keine bisher in Python geschrieben. Der nächstgelegene ich gekommen bin ist die Datei libgedcom. py von dem Gramps-Projekt, aber das ist so voll von Verweisen auf Gramps Module als nicht für mich verwendbar sein.

Ich möchte nur eine einfache Standalone-GEDCOM-Parser-Bibliothek in Python geschrieben. Ist diese exist?

War es hilfreich?

Lösung

Vor ein paar Jahren schrieb ich einen simplen GEDCOM zu XML Übersetzer in Python als Teil einer größeres Projekt . Ich fand, dass in einem XML-Format mit den GEDCOM Daten zu tun war viel einfacher (vor allem, wenn der nächste Schritt involviert XSLT).

Ich habe nicht den Code online im Moment, so dass ich das Modul in diese Nachricht eingefügt habe. Dies funktioniert für mich; keine Garantien. Hoffe, das hilft aber.

import codecs, os, re, sys
from xml.sax.saxutils import escape

fn = sys.argv[1]

ged = codecs.open(fn, encoding="cp437")
xml = codecs.open(fn+".xml", "w", "utf8")
xml.write("""<?xml version="1.0"?>\n""")
xml.write("<gedcom>")
sub = []
for s in ged:
    s = s.strip()
    m = re.match(r"(\d+) (@(\w+)@ )?(\w+)( (.*))?", s)
    if m is None:
        print "Error: unmatched line:", s
    level = int(m.group(1))
    id = m.group(3)
    tag = m.group(4)
    data = m.group(6)
    while len(sub) > level:
        xml.write("</%s>\n" % (sub[-1]))
        sub.pop()
    if level != len(sub):
        print "Error: unexpected level:", s
    sub += [tag]
    if id is not None:
        xml.write("<%s id=\"%s\">" % (tag, id))
    else:
        xml.write("<%s>" % (tag))
    if data is not None:
        m = re.match(r"@(\w+)@", data)
        if m:
            xml.write(m.group(1))
        elif tag == "NAME":
            m = re.match(r"(.*?)/(.*?)/$", data)
            if m:
                xml.write("<forename>%s</forename><surname>%s</surname>" % (escape(m.group(1).strip()), escape(m.group(2))))
            else:
                xml.write(escape(data))
        elif tag == "DATE":
            m = re.match(r"(((\d+)?\s+)?(\w+)?\s+)?(\d{3,})", data)
            if m:
                if m.group(3) is not None:
                    xml.write("<day>%s</day><month>%s</month><year>%s</year>" % (m.group(3), m.group(4), m.group(5)))
                elif m.group(4) is not None:
                    xml.write("<month>%s</month><year>%s</year>" % (m.group(4), m.group(5)))
                else:
                    xml.write("<year>%s</year>" % m.group(5))
            else:
                xml.write(escape(data))
        else:
            xml.write(escape(data))
while len(sub) > 0:
    xml.write("</%s>" % sub[-1])
    sub.pop()
xml.write("</gedcom>\n")
ged.close()
xml.close()

Andere Tipps

habe ich Code aus mwhite Antwort genommen, es erweiterte ein wenig (OK, mehr als nur ein bisschen) und bei Github veröffentlicht: http://github.com/dijxtra/simplepyged . Ich nehme Vorschläge, was sonst hinzuzufügen: -)

Ich weiß, dieser Thread ist ziemlich alt, aber ich fand es in meinen Recherchen sowie dieses Projekt https : //github.com/madprime/python-gedcom/

Die Quelle ist squeeky sauber und sehr funktionell.

könnten Sie verwenden das SWIG Tool für einschließlich C-Bibliotheken obwohl die Muttersprache-Schnittstelle. Sie werden Anrufe an der C api aus Python machen müssen, aber der Rest des Codes kann Python nur sein.

Kann ein wenig abschreckend klingen, aber wenn Sie etwas Setup bekommen, die beide zusammen mit nicht schlecht sein. Es kann einige Macken sein, je nachdem wie die C-Bibliothek geschrieben wurde, aber man müsste mit etwas ganz gleich behandeln, die Option, die Sie verwendet.

Ein weiterer Grund-Parser für das GEDCOM 5.5 Format: https://github.com/rootsdev/python -gedcom-Parser

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top