¿Hay un analizador GEDCOM escrito en Python? [cerrado]
Pregunta
GEDCOM es un estándar para el intercambio de datos genealógicos.
analizadoresHe hallado escrito en
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?
Solución
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
Se puede utilizar el href="http://www.swig.org/" rel="nofollow noreferrer"> TRAGO herramienta para
Puede sonar un poco complicado, pero una vez que la configuración cosa, usando los dos juntos no será malo. Puede haber algunas peculiaridades en función de cómo la biblioteca C fue escrito, pero que tendría que hacer frente a algunas independientemente de la opción que utilizó.
Otro programa de análisis básico para el formato GEDCOM 5.5: https://github.com/rootsdev/python -gedcom-parser