سؤال

GEDCOM هي معيار لتبادل بيانات Genealogical.

لقد وجدت المحللين مكتوبة في

لكن لا شيء مكتوب حتى الآن في بيثون. الأقرب الذي أتيت هو الملف libedcom.py. من مشروع Gramps، ولكن هذا مليء بالإشارات إلى وحدات Gramps لأنها غير صالحة للاستعمال بالنسبة لي.

أريد فقط مكتبة محلل GEDCOM Standalone مكتوبة في بيثون. هل هذا موجود؟

هل كانت مفيدة؟

المحلول

منذ بضع سنوات، كتبت GEDCOM المبسط إلى مترجم XML في بيثون كجزء من مشروع أكبر. وبعد لقد وجدت أن التعامل مع بيانات GEDCOM بتنسيق XML كان أسهل بكثير (خاصة عند المشاركة التالية 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()

نصائح أخرى

لقد أخذت رمز من إجابة MWHITE، مددها قليلا (موافق، أكثر من قليلا فقط) ونشرها في Github: http://github.com/dijxtra/simplepepress.. وبعد آخذ اقتراحات حول ما لإضافة :-)

أعرف أن هذا الموضوع قديم جدا، لكنني وجدت ذلك في عمليات البحث الخاصة بي وكذلك هذا المشروع https://github.com/madprime/python-gedcom/

المصدر هو Squeeky نظيفة وظيفية للغاية.

يتم ربط محلل GEDCOM للأغراض العامة في بيثون http://ilab.cs.byu.edu/cs460/2006w/assignments/program1.html.

يمكنك استخدام جرعة كبيرة أداة بما في ذلك مكتبات C على الرغم من واجهة اللغة الأصلية. سيكون عليك إجراء مكالمات ضد API C من داخل Python، ولكن بقية الكود يمكن أن يكون بيثون فقط.

قد تبدو شاقة بعض الشيء، ولكن بمجرد أن تحصل على إعداد شيء، فإن استخدام الاثنين معا لن يكون سيئا. قد يكون هناك بعض الوجوه اعتمادا على كيفية كتابة مكتبة C، لكن عليك التعامل مع بعضها بغض النظر عن الخيار الذي استخدمته.

محلل أساسي آخر لتنسيق GEDCOM 5.5: https://github.com/rootsdev/python-gedcom-parser.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top