2013-03-02 11 views
7

मेरे पास .ttl फ़ॉर्म में एक फ़ाइल है। इसमें निम्नलिखित गुणों के चौगुनी युक्त 4 विशेषताएँ/कॉलम हैं:RDFLib के साथ .ttl फ़ाइलों को पार्स कैसे करें?

  1. (id, student_name, student_address, student_phoneno)
  2. (id, faculty_name, faculty_address, faculty_phoneno)

मुझे पता है कि .n3 आरडीएफएलआईबी के साथ फॉर्म ट्रिपल कैसे पार्स करें;

from rdflib import Graph 
g = Graph() 
g.parse("demo.nt", format="nt") 

लेकिन मुझे यकीन नहीं है कि इन चौगुनी को कैसे पार्स करना है।

मेरा इरादा किसी विशेष आईडी से संबंधित सभी जानकारी को पार्स और निकालना है। आईडी छात्र और संकाय दोनों के लिए समान हो सकती है।

मैं इन चौगुनी को संसाधित करने के लिए RDFLib का उपयोग कैसे कर सकता हूं और इसे id पर आधारित एकत्रीकरण के लिए उपयोग कर सकता हूं?

उदाहरण .ttl फ़ाइल से स्निपेट:

#@ <id1> 
<Alice> <USA> <12345> 

#@ <id1> 
<Jane> <France> <78900> 
+0

'प्रश्न में संदर्भित टैग द्वारा संदर्भित एक के रूप में एक ही ttl' है? –

+0

टीटीएल फॉर्म क्या है? –

+1

मुझे लगता है कि इसकी [टर्टल - टेर्स आरडीएफ ट्रिपल लैंग्वेज] (http://www.w3.org/TeamSubmission/turtle/) – Abhijit

उत्तर

0

ऐसा लगता है वर्तमान में Turtle - Terse RDF Triple Language

पार्स करने के लिए आप पहले से ही व्याकरण जानते हैं ऐसी कोई पुस्तकालय वर्तमान है, आपका सर्वश्रेष्ठ दांव है पहले PyParsing को उपयोग करने के लिए एक व्याकरण बनाएं और फिर फ़ाइल को पार्स करें।

मैं भी अपनी जरूरत

0

आप सांप के रूप में कर सकते हैं और कॉफी का सुझाव के लिए निम्नलिखित EBNF implementation अनुकूल करने के लिए, केवल उपज बयानों के साथ एक पाश में है कि समारोह (या इसके कोड) लपेट सुझाव है। यह जनरेटर बनाता है, जिसे फ्लाई पर अगली पंक्ति के डिब्बे बनाने के लिए इसे क्रमशः कहा जा सकता है। मान लें कि आप, उदाहरण के लिए, सांप 'parse_to_dict का उपयोग कर एक csv करने के लिए इन लिखने के लिए जा रहे थे:

def dict_generator(lines): 
    for line in lines: 
     yield parse_to_dict(line) 

--या:

import re 
import csv 

writer = csv.DictWriter(open(outfile, "wb"), fieldnames=["id", "name", "address", "phone"]) 
# or whatever 

आप एक समारोह के रूप या एक इनलाइन समझ के साथ एक जनरेटर बना सकते हैं -

dict_generator = (parse_to_dict(line) for line in lines) 

ये काफी समकक्ष हैं। इस बिंदु पर आप dict_generator.next() पर कॉल करके एक dict-parsed लाइन प्राप्त कर सकते हैं, और आप एक समय में जादुई रूप से एक प्राप्त करेंगे- कोई अतिरिक्त रैम थ्रैशिंग शामिल नहीं है।

यदि आपके पास कच्चे डेटा के 16 गीगा हैं, तो आप भी लाइनों को खींचने के लिए जेनरेटर बनाने पर विचार कर सकते हैं। वे वास्तव में उपयोगी हैं।

अतः से जनरेटर और कुछ डॉक्स पर और जानकारी: What can you use Python generator functions for? http://wiki.python.org/moin/Generators

+0

सांप और कॉफी..parse_to_dict लाइन वहां नहीं है और मैं भूल गया कि वह लाइन क्या करने का इरादा रखती है –

6

TurtleNotation 3 वाक्य रचना के एक सबसेट तो rdflibformat='n3' का उपयोग कर इसे पार्स करने के लिए सक्षम होना चाहिए है। जांचें कि rdflib टिप्पणियां संरक्षित करता है (id एस आपके नमूने में टिप्पणियों (#...) में निर्दिष्ट हैं)।यदि नहीं और इनपुट प्रारूप के रूप में अपने उदाहरण में दिखाया गया है तो आप इसे मैन्युअल रूप से पार्स सकता है के रूप में सरल है:

import re 
from collections import namedtuple 
from itertools import takewhile 

Entry = namedtuple('Entry', 'id name address phone') 

def get_entries(path): 
    with open(path) as file: 
     # an entry starts with `#@` line and ends with a blank line 
     for line in file: 
      if line.startswith('#@'): 
       buf = [line] 
       buf.extend(takewhile(str.strip, file)) # read until blank line 
       yield Entry(*re.findall(r'<([^>]+)>', ''.join(buf))) 

print("\n".join(map(str, get_entries('example.ttl')))) 

आउटपुट:

Entry(id='id1', name='Alice', address='USA', phone='12345') 
Entry(id='id1', name='Jane', address='France', phone='78900') 

एक डाटाबेस के लिए प्रविष्टियां सहेजने के लिए:

import sqlite3 

with sqlite3.connect('example.db') as conn: 
    conn.execute('''CREATE TABLE IF NOT EXISTS entries 
      (id text, name text, address text, phone text)''') 
    conn.executemany('INSERT INTO entries VALUES (?,?,?,?)', 
        get_entries('example.ttl')) 

यदि आपको पाइथन में कुछ पोस्टप्रोसेसिंग की आवश्यकता है तो आईडी द्वारा समूह:

import sqlite3 
from itertools import groupby 
from operator import itemgetter 

with sqlite3.connect('example.db') as c: 
    rows = c.execute('SELECT * FROM entries ORDER BY id LIMIT ?', (10,)) 
    for id, group in groupby(rows, key=itemgetter(0)): 
     print("%s:\n\t%s" % (id, "\n\t".join(map(str, group)))) 

आउटपुट:

id1: 
    ('id1', 'Alice', 'USA', '12345') 
    ('id1', 'Jane', 'France', '78900') 
संबंधित मुद्दे