Há um GEDCOM analisador escrito em Python?[fechado]
Pergunta
GEDCOM é um padrão para a troca de dados genealógicos.
Eu encontrei analisadores escrito em
mas nenhum até agora escrito em Python.O mais próximo que eu cheguei é a de ficheiro libgedcom.py a partir do GRAMPS projeto, mas que é tão cheio de referências para GRAMPS módulos como para não ser útil para mim.
Eu só quero um simples autônomo GEDCOM parser a biblioteca escrita em Python.Isso existe?
Solução
Alguns anos atrás eu escrevi um simplista GEDCOM para XML tradutor em Python, como parte de um projeto maior.Eu achei que lidar com o GEDCOM dados em um formato XML foi muito mais fácil (especialmente quando a próxima etapa envolveu XSLT).
Eu não tenho o código de on-line no momento, então eu colou o módulo para esta mensagem.Isso funciona para mim;não há garantias.Espero que isso ajude embora.
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()
Outras dicas
Eu tenho tido código de mwhite resposta, estendeu-lo um pouco (OK, mais do que apenas um pouco) e publicado no github: http://github.com/dijxtra/simplepyged.Eu tomo sugestões sobre o que mais a acrescentar :-)
Eu sei que esta discussão é bem antiga, mas eu achei em minhas pesquisas, bem como este projeto https://github.com/madprime/python-gedcom/
A fonte é squeeky limpo e muito funcional.
Um propósito geral GEDCOM analisador em Python é ligado a partir de http://ilab.cs.byu.edu/cs460/2006w/assignments/program1.html
Você pode usar o GOLE ferramenta para a inclusão de bibliotecas C que o nativo de interface de idioma.Você terá de fazer chamadas contra a api C de dentro do Python, mas o resto do seu código pode ser o Python só.
Pode parecer um pouco assustador, mas depois que você pegar coisa a configuração, usando os dois juntos, não será ruim.Pode haver algumas peculiaridades dependendo de como a biblioteca C foi escrito, mas você teria que lidar com alguns, não importa qual opção você usou.
Outro analisador para o GEDCOM 5.5 formato: https://github.com/rootsdev/python-gedcom-parser