Pregunta

GEDCOM es un estándar para el intercambio de datos genealógicos.

analizadores

He hallado escrito en

  • C
  • Perl
  • Rubí
  • e incluso Factor rel="noreferrer"> href="http://paste.factorcode.org/paste?id=975"

pero ninguno hasta ahora escrito en Python. Lo más cerca que he llegado es el archivo libgedcom. py del proyecto GRAMPS, pero que está tan lleno de referencias a los módulos de GRAMPS como para no ser utilizable para mí.

Sólo quiero una biblioteca simple analizador GEDCOM independiente escrito en Python. ¿Existe esta?

¿Fue útil?

Solución

Hace

A los pocos años escribí un GEDCOM simplista traductor XML en Python como parte de un proyecto más amplio . He descubierto que se trata de los datos GEDCOM en un formato XML era mucho más fácil (especialmente cuando el siguiente paso involucrado XSLT).

No tengo el código en línea en este momento, así que he pegado el módulo en este mensaje. Esto funciona para mí; no hay garantías. Espero que esta ayuda sin embargo.

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

Otros consejos

Me he tomado el código de la respuesta de mwhite, se extendió un poco (bueno, más que sólo un poco) y publicado en github: http://github.com/dijxtra/simplepyged . Tomo sugerencias sobre lo más que añadir: -)

Sé que este hilo es bastante viejo, pero me encontré en mis búsquedas, así como este proyecto https : //github.com/madprime/python-gedcom/

La fuente es super limpia y muy funcional.

Un analizador GEDCOM de propósito general en Python está enlazada desde http: //ilab.cs.byu.edu/cs460/2006w/assignments/program1.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top