GEDCOM是一个标准的交换系统的数据。

我已经找到了分析程序编写

但迄今为止没有写在蟒蛇。最近我来的文件 libgedcom.py 从爷爷的项目,但这是以全面的参考来爷爷的模块作为不可用于我。

我只想要一个简单的独立GEDCOM分析器库编写蟒蛇。这是否存在?

有帮助吗?

解决方案

几年前我写过一个简单的GEDCOM XML翻译在蟒蛇的一部分 较大的项目.我发现,处理的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,不仅仅是一个点),并张贴在想: http://github.com/dijxtra/simplepyged.我建议还有什么要补充:-)

我知道这线是很老,但我找到它在我的搜查,以及作为这个项目 https://github.com/madprime/python-gedcom/

来源是squeeky干净,非常功能。

你可以使用 痛饮 工具C包括图书馆虽然语言界面。你必须打电话对C api从内蟒蛇,但是其余部分的你的代码可以被蟒蛇只。

可能听起来有点令人生畏,但是一旦你得到的事情设置、使用的两个一起不会有坏。可能有一些怪癖,这取决于如何C库是书面的,但你必须要处理一些无论哪个选项的使用。

另一个基本分析器的GEDCOM5.5格式: https://github.com/rootsdev/python-gedcom-parser

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top