2013-03-02 20 views
7

Mam plik w formularzu .ttl. Ma 4 atrybuty/kolumny zawierające czteroosobowe znaki w następującej postaci:Jak analizować pliki .ttl za pomocą RDFLib?

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

Wiem, jak parsować formularze za pomocą RDFLib;

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

, ale nie jestem pewien, jak przeanalizować te czterokrotnie.

Moim zamiarem jest przeanalizować i wyodrębnić wszystkie informacje dotyczące konkretnego identyfikatora. Identyfikator może być taki sam dla ucznia i wykładowcy.

Jak używać RDFLib do przetwarzania tych czterokrotnie i używać go do agregacji na podstawie id?

Przykładowy fragment z .ttl pliku:

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

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

Czy 'ttl' mowa w pytaniu sam jak ten odwołuje tagu? –

+0

Co to jest formularz TTL? –

+1

Myślę, że jest to [Turtle - Terse RDF Triple Language] (http://www.w3.org/TeamSubmission/turtle/) – Abhijit

Odpowiedz

0

Można zrobić jak węże i kawy sugeruje, tylko owinąć tę funkcję (lub jego kod) w pętli z wypowiedzi dochodowości. Tworzy to generator, który można nazwać iteracyjnie, by w locie tworzyć kolejne dyktando linii. Zakładając, że będziemy pisać je do pliku CSV, na przykład, za pomocą parse_to_dict węże:

import re 
import csv 

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

można utworzyć generatora w funkcji lub ze zrozumieniem inline:

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

-OR -

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

Są one w dużym stopniu równoważne. W tym momencie możesz uzyskać linijkę z analizowanymi literami, dzwoniąc pod numer dict_generator.next(), a otrzymasz magicznie po jednym na raz - nie ma potrzeby dołączania dodatkowych pamięci RAM.

Jeśli masz 16 gigabajtów nieprzetworzonych danych, możesz rozważyć utworzenie generatora, który będzie również pobierał linie. Są naprawdę przydatne.

Więcej informacji na temat generatorów z SO i niektórych docs: What can you use Python generator functions for? http://wiki.python.org/moin/Generators

+0

Snakes and coffee..parse_to_dict nie ma linii i zapomniałem, co ta linia zamierzała zrobić –

6

Turtle jest podzbiorem Notation 3 składni tak rdflib powinien być w stanie przetworzyć go za pomocą format='n3'. Sprawdź, czy rdflib zachowuje komentarze (id s są określone w komentarzach (#...) w twojej próbce).Jeśli nie, a format wejściowy jest tak proste, jak to pokazano w przykładzie to można go analizować ręcznie:

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')))) 

wyjściowa:

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

Aby zapisać dane do db:

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')) 

Aby pogrupować według identyfikatora, jeśli potrzebujesz przetwarzania w Pythonie:

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)))) 

wyjściowa:

id1: 
    ('id1', 'Alice', 'USA', '12345') 
    ('id1', 'Jane', 'France', '78900') 
Powiązane problemy