2009-12-17 14 views
16

GEDCOM वंशावली डेटा का आदान-प्रदान करने के लिए एक मानक है।क्या पाइथन में लिखा गया कोई GEDCOM पार्सर है?

मैंने पाया पारसर्स

में लिखा, लेकिन कोई भी अब तक अजगर में लिखा है। सबसे नज़दीक मैं आया हूं, ग्रामपीएस प्रोजेक्ट से libgedcom.py फ़ाइल है, लेकिन यह मेरे लिए प्रयोग योग्य नहीं होने के कारण ग्रामप्स मॉड्यूल के संदर्भों से भरा हुआ है।

मैं सिर्फ पाइथन में लिखी गई एक साधारण स्टैंडअलोन GEDCOM पार्सर लाइब्रेरी चाहता हूं। क्या यह अस्तित्व में है?

उत्तर

8

कुछ साल पहले मैंने larger project के हिस्से के रूप में पायथन में एक्सएमएल अनुवादक के लिए एक सरल GEDCOM लिखा था। मैंने पाया कि एक 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 उपकरण का उपयोग कर सकते हैं। आपको पायथन के भीतर से सी एपीआई के खिलाफ कॉल करना होगा, लेकिन आपका शेष कोड केवल पायथन ही हो सकता है।

थोड़ा मुश्किल लग सकता है, लेकिन एक बार जब आप चीज सेटअप करते हैं, तो दोनों का उपयोग करके बुरा नहीं होगा। सी लाइब्रेरी कैसे लिखी गई थी, इस पर कुछ quirks हो सकता है, लेकिन आप किसी भी विकल्प से निपटने के लिए कोई फर्क नहीं पड़ता कि आप किस विकल्प का इस्तेमाल किया।

+0

या उपयोग ctypes या Cython (Pyrex से अलग)। –

7

मैं mwhite के जवाब से कोड लिया है जुड़ा हुआ है, यह थोड़ा बढ़ाया (ठीक है, बस थोड़ा और अधिक से अधिक) और GitHub पर तैनात: http://github.com/dijxtra/simplepyged। मैं और क्या जोड़ने के लिए :-)

4

मैं जानता हूँ कि इस सूत्र बहुत पुराना है के बारे में सुझाव ले, लेकिन मैं इस परियोजना https://github.com/madprime/python-gedcom/

स्रोत squeeky स्वच्छ और बहुत कार्यात्मक है और साथ ही अपनी खोजों में यह पाया।

-1

GEDCOM 5.5 प्रारूप के लिए एक और बुनियादी पार्सर: https://github.com/rootsdev/python-gedcom-parser

+0

कृपया स्पष्ट रूप से ऑफ-विषय प्रश्नों पर उत्तर पोस्ट न करें! [देखें: ** क्या किसी को विषय प्रश्नों पर सलाह देना चाहिए? **] (http://meta.stackoverflow.com/q/276572/1768232) ऑफ-विषय प्रश्नों को बंद और हटाया जा सकता है, जो आपके योगदान को समाप्त कर सकता है। यहां, सवाल एक ऑफ-साइट संसाधन मांग रहा है और बंद होने के रास्ते पर है। –

संबंधित मुद्दे