2009-12-17 33 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

相關問題