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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top