是否有用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库,可能会有一些怪癖,但无论使用哪种选项,都必须处理一些问题。
我已经采取了代码mwhite的答案的联系,扩大了一点(OK,不仅仅是多一点),并在github上发布: http://github.com/dijxtra/simplepyged。我需要大约还有什么补充:-)
的GEDCOM 5.5格式的另一个基本的解析器:https://github.com/rootsdev/python-gedcom-parser
请不要在明显的题外话题上回答问题! [请参阅:**是否应该提出关于主题问题的建议?**](http://meta.*.com/q/276572/1768232)可以关闭和删除离题问题,这可能会使您的贡献无效。在这里,问题是要求一个非现场资源,并且正在关闭。 – 2016-03-07 12:08:52
或者使用ctypes的或用Cython(从高硼硅分叉)。 – 2009-12-17 12:51:38