GEDCOM是交換系譜數據的標準。是否有用Python編寫的GEDCOM解析器?
我發現解析器寫在
但沒有到目前爲止用Python編寫的。我最接近的是來自GRAMPS項目的文件libgedcom.py,但是對GRAMPS模塊的引用充滿了對我不可用的文件。
我只是想用Python編寫一個簡單的獨立GEDCOM解析器庫。這是否存在?
GEDCOM是交換系譜數據的標準。是否有用Python編寫的GEDCOM解析器?
我發現解析器寫在
但沒有到目前爲止用Python編寫的。我最接近的是來自GRAMPS項目的文件libgedcom.py,但是對GRAMPS模塊的引用充滿了對我不可用的文件。
我只是想用Python編寫一個簡單的獨立GEDCOM解析器庫。這是否存在?
幾年前,我在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()
您可以使用SWIG工具通過本地語言界面包含C庫。您必須從Python內部對C api進行調用,但其餘代碼只能是Python。
可能聽起來有點令人生畏,但一旦你把東西安裝好了,一起使用它們不會有什麼不好。取決於如何編寫C庫,可能會有一些怪癖,但無論使用哪種選項,都必須處理一些問題。
Python中的通用GEDCOM解析器從http://ilab.cs.byu.edu/cs460/2006w/assignments/program1.html
我已經採取了代碼mwhite的答案的聯繫,擴大了一點(OK,不僅僅是多一點),並在github上發佈: http://github.com/dijxtra/simplepyged。我需要大約還有什麼補充:-)
我知道這個線程是很老的建議,但我發現它在我的搜索,以及這個項目https://github.com/madprime/python-gedcom/
源是squeeky乾淨,非常實用。
的GEDCOM 5.5格式的另一個基本的解析器:https://github.com/rootsdev/python-gedcom-parser
請不要在明顯的題外話題上回答問題! [請參閱:**是否應該提出關於主題問題的建議?**](http://meta.stackoverflow.com/q/276572/1768232)可以關閉和刪除離題問題,這可能會使您的貢獻無效。在這裏,問題是要求一個非現場資源,並且正在關閉。 – 2016-03-07 12:08:52
或者使用ctypes的或用Cython(從高硼硅分叉)。 – 2009-12-17 12:51:38