Domanda

GEDCOM è uno standard per lo scambio di dati genealogici.

ho trovato parser scritti in

  • C
  • perl
  • Rubino
  • e anche Factor rel="noreferrer"> href="http://paste.factorcode.org/paste?id=975"

ma nessuno finora scritto in Python. Il più vicino Sono venuto è il file libgedcom. py dal progetto GRAMPS, ma che è così pieno di riferimenti ai moduli GRAMPS da non essere utilizzabile per me.

Voglio solo una semplice libreria parser autonoma GEDCOM scritto in Python. Questo esiste?

È stato utile?

Soluzione

Alcuni anni fa ho scritto un GEDCOM semplicistico traduttore XML in Python come parte di un progetto più ampio . Ho scoperto che fare con i dati GEDCOM in un formato XML era molto più facile (soprattutto quando il passo successivo ha coinvolto XSLT).

Non ho il codice online in questo momento, così ho incollato il modulo in questo messaggio. Questo funziona per me; non ci sono garanzie. Spero che questo aiuti però.

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()

Altri suggerimenti

Ho preso il codice di risposta di mwhite, esteso un po '(OK, molto più di un po') e pubblicato su GitHub: http://github.com/dijxtra/simplepyged . Prendo suggerimenti su cosa altro da aggiungere: -)

So che questa discussione è piuttosto vecchio, ma ho trovato nelle mie ricerche, così come questo progetto https : //github.com/madprime/python-gedcom/

La fonte è pulitissimo e molto funzionale.

Un GEDCOM parser generico in Python è legata da http: //ilab.cs.byu.edu/cs460/2006w/assignments/program1.html

È possibile utilizzare il SWIG strumento per l'inclusione di librerie C anche se l'interfaccia lingua madre. Dovrete effettuare chiamate contro l'API C dall'interno Python, ma il resto del codice può essere Python solo.

può sembrare un po 'scoraggiante, ma una volta messa a punto cosa, utilizzando le due cose insieme non sarà male. Ci possono essere alcune stranezze a seconda di come la libreria C è stato scritto, ma si sarebbe avere a che fare con un po ', non importa quale opzione è stato utilizzato.

Un altro parser di base per il formato GEDCOM 5.5: https://github.com/rootsdev/python -gedcom-parser

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top