Существует ли парсер GEDCOM, написанный на Python?[закрыто]

StackOverflow https://stackoverflow.com/questions/1919593

Вопрос

GEDCOM — это стандарт обмена генеалогическими данными.

Я нашел парсеры, написанные на

но пока ни один из них не написан на Python.Ближе всего я подошел к файлу libgedcom.py из проекта GRAMPS, но он настолько полон ссылок на модули GRAMPS, что мне он непригоден.

Мне просто нужна простая автономная библиотека синтаксического анализатора GEDCOM, написанная на Python.Существует ли это?

Это было полезно?

Решение

Несколько лет назад я написал упрощенный переводчик GEDCOM в XML на Python в рамках проекта более крупный проект.Я обнаружил, что работать с данными GEDCOM в формате XML гораздо проще (особенно, когда следующим шагом был XSLT).

На данный момент у меня нет кода в сети, поэтому я вставил модуль в это сообщение.Это работает для меня;никаких гарантий.Надеюсь, это поможет.

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

Другие советы

Я взял код из ответа mwhite, немного расширил его (хорошо, больше, чем просто немного) и разместил на github: http://github.com/dijxtra/simplepyged.Принимаю предложения, что еще добавить :-)

Я знаю, что эта тема довольно старая, но я нашел ее как в поиске, так и в этом проекте. https://github.com/madprime/python-gedcom/

Источник безупречно чистый и очень функциональный.

Синтаксический анализатор GEDCOM общего назначения на Python связан с http://ilab.cs.byu.edu/cs460/2006w/assignments/program1.html

Вы можете использовать СВИГ инструмент для включения библиотек C через интерфейс на родном языке.Вам придется выполнять вызовы API C из Python, но остальная часть вашего кода может быть только Python.

Это может показаться немного устрашающим, но как только вы все настроите, использовать их вместе будет неплохо.В зависимости от того, как была написана библиотека C, могут быть некоторые особенности, но с некоторыми придется иметь дело независимо от того, какой вариант вы используете.

Еще один базовый парсер формата GEDCOM 5.5: https://github.com/rootsdev/python-gedcom-parser

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top