문제

GEDCOM은 계보 데이터 교환의 표준입니다.

나는 구문자가 쓰여진 것을 발견했다

그러나 지금까지 파이썬으로 쓰여진 것은 없습니다. 내가 가장 가까운 것은 파일입니다 libedcom.py Gramps 프로젝트에서 그러나 그것은 Gramps 모듈에 대한 참조로 가득 차 있습니다.

파이썬으로 쓰여진 간단한 독립형 Gedcom Parser 라이브러리를 원합니다. 이것이 존재합니까?

도움이 되었습니까?

해결책

몇 년 전 저는 Python의 XML 번역기에게 단순한 GEDCOM을 더 큰 프로젝트. 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의 답변에서 코드를 가져 와서 약간 확장하고 (OK, 조금 이상) GitHub에 게시했습니다. http://github.com/dijxtra/simplepyged. 나는 추가 할 또 무엇이 무엇을 추가 해야하는지에 대한 제안을한다 :-)

이 스레드가 꽤 오래되었음을 알고 있지만이 프로젝트뿐만 아니라 내 검색에서 찾았습니다. https://github.com/madprime/python-edcom/

소스는 짜증나고 깨끗하고 매우 기능적입니다.

Python의 일반 목적 Gedcom Parser가 연결되어 있습니다 http://ilab.cs.byu.edu/cs460/2006w/assignments/program1.html

당신은 사용할 수 있습니다 통음 모국어 인터페이스를 통해 C 라이브러리를 포함하는 도구. Python 내에서 C API에 대해 전화를해야하지만 나머지 코드는 Python 일 수 있습니다.

조금 어려워 질 수 있지만 일단 설정을 시작하면 두 사람을 함께 사용하면 나쁘지 않습니다. C 라이브러리가 작성된 방식에 따라 약간의 무리가있을 수 있지만 사용한 옵션에 관계없이 일부를 처리해야합니다.

GEDCOM 5.5 형식의 또 다른 기본 파서 : https://github.com/rootsdev/python-edcom-parser

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top