Question

GEDCOM est une norme d'échange de données généalogiques.

Je l'ai trouvé dans parseurs écrits

, mais pas encore écrit en Python. Le plus proche que je suis venu est le fichier libgedcom. py du projet Gramps, mais qui est plein de références aux modules GRAMPS pour ne pas être utilisable pour moi.

Je veux juste une simple bibliothèque de l'analyseur GEDCOM autonome écrit en Python. Est-ce que cela existe?

Était-ce utile?

La solution

Il y a quelques années j'ai écrit un GEDCOM simpliste de traducteur XML en Python dans le cadre d'un de projet plus vaste . Je trouve que le traitement des données GEDCOM dans un format XML est beaucoup plus facile (surtout lorsque l'étape suivante a consisté à XSLT).

Je n'ai pas le code en ligne pour le moment, donc j'ai collé le module dans ce message. Cela fonctionne pour moi; aucune garantie. Espérons que cela aide bien.

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

Autres conseils

J'ai pris le code de la réponse de mwhite, étendu un peu (OK, plus que juste un peu) et affiché sur GitHub: http://github.com/dijxtra/simplepyged . Je prends des suggestions sur ce que d'autre à ajouter: -)

Je sais que ce fil est assez vieux, mais je l'ai trouvé dans mes recherches, ainsi que ce projet https : //github.com/madprime/python-gedcom/

La source est grincent propre et très fonctionnel.

Un analyseur GEDCOM à usage général dans le python est lié de http: //ilab.cs.byu.edu/cs460/2006w/assignments/program1.html

Vous pouvez utiliser l'outil SWIG y compris les bibliothèques C si l'interface de langue maternelle. Vous devrez faire des appels contre la C api à partir de Python, mais le reste de votre code peut être Python uniquement.

peut sembler un peu intimidant, mais une fois que vous obtenez la configuration chose, en utilisant les deux ensemble ne sera pas mauvais. Il peut y avoir quelques bizarreries selon la façon dont la bibliothèque C a été écrit, mais vous auriez à traiter certains, peu importe l'option que vous utilisez.

Un autre analyseur de base pour le format GEDCOM 5.5: https://github.com/rootsdev/python -gedcom-analyseur

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top