2009-12-17 88 views
16

GEDCOM是交换系谱数据的标准。是否有用Python编写的GEDCOM解析器?

我发现解析器写在

但没有到目前为止用Python编写的。我最接近的是来自GRAMPS项目的文件libgedcom.py,但是对GRAMPS模块的引用充满了对我不可用的文件。

我只是想用Python编写一个简单的独立GEDCOM解析器库。这是否存在?

回答

8

几年前,我在Python中为XML转换器写了一个简单的GEDCOM作为larger project的一部分。我发现以XML格式处理GEDCOM数据要容易得多(特别是当下一步涉及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() 
1

您可以使用SWIG工具通过本地语言界面包含C库。您必须从Python内部对C api进行调用,但其余代码只能是Python。

可能听起来有点令人生畏,但一旦你把东西安装好了,一起使用它们不会有什么不好。取决于如何编写C库,可能会有一些怪癖,但无论使用哪种选项,都必须处理一些问题。

+0

或者使用ctypes的或用Cython(从高硼硅分叉)。 – 2009-12-17 12:51:38

-1

的GEDCOM 5.5格式的另一个基本的解析器:https://github.com/rootsdev/python-gedcom-parser

+0

请不要在明显的题外话题上回答问题! [请参阅:**是否应该提出关于主题问题的建议?**](http://meta.stackoverflow.com/q/276572/1768232)可以关闭和删除离题问题,这可能会使您的贡献无效。在这里,问题是要求一个非现场资源,并且正在关闭。 – 2016-03-07 12:08:52

相关问题