はありまGEDCOMパーサPythonで記述されて?[定休日]
質問
GEDCOM標準交換の系譜データです。
がその場で発音を確認することがparsers書
あなたのこれまでに書きます。最寄私はファイル libgedcom.py から、たくさんすぎる"忙しい"プロジェクトが、それは本的な省エネルギー-エネルギーへの参照のたくさんすぎる"忙しい"モジュールとして使用できないことでした。
さんのプロGEDCOMパーサの図書館の書きします。このことがありますか?
解決
数年前、私は大規模プロジェクトの一環として、PythonでXMLトランスレータに単純化したGEDCOMを書きましたに。私は(次のステップでは、XSLTを関与する場合は特に)XML形式でGEDCOMのデータを扱うことははるかに簡単であることがわかっています。
私は、現時点では、オンラインでのコードを持っていないので、私はこのメッセージにモジュールを貼り付けました。これは私のために動作します。保証はありません。これはしかしお役に立てば幸いです。
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、それ以上)、それを拡張し、githubのに掲載:<のhref =「http://github.com/dijxtra/simplepyged」のrel =」 noreferrer "> http://github.com/dijxtra/simplepyged を。私は追加する他に何についての提案を取る: - )
私はこのスレッドがかなり古いですけど、私はこのプロジェクトだけでなく、私の検索でそれを見つけた HTTPS ://github.com/madprime/python-gedcom/する
ソースはきれいsqueeky、非常に機能的です。
Pythonで汎用GEDCOMパーサは HTTPからリンクされています。 //ilab.cs.byu.edu/cs460/2006w/assignments/program1.htmlする
あなたはネイティブ言語インタフェースかかわらCライブラリを含むための SWIG のツールを使用することができます。あなたは、Pythonの中からCのAPIに対する呼び出しを行う必要があるでしょうが、あなたのコードの残りの部分は唯一のPythonすることができます。
は少し困難な聞こえるかもしれないが、次の2つを使用して、事のセットアップを得れば一緒に悪いことではないだろう。そこCライブラリが書かれた方法によっては、いくつかの癖かもしれないが、あなたは、あなたが使用されるいくつかに関係なく、どのオプションに対処する必要があると思います。
GEDCOM 5.5形式のためのもう一つの基本的なパーサ: https://github.com/rootsdev/python -gedcom-パーサの