Κυριακή 17 Νοεμβρίου 2013

Σχετικά με μορφές αρχείων ανοιχτών δεδομένων

Παρόλα που εκ πρώτης όψεως μοιάζει αρκετά τεχνικό θέμα, ενδιαφέρει πια ένα ευρύτερο κοινό, καθώς η αναζήτηση και διάδοση (ανοιχτών και μη...) δεδομένων είναι μία καθημερινότητα για τους περισσότερους από εμάς. Το παρακάτω άρθρο από την OKFN Greece αποτελεί έναν βασικό οδηγό:


"Αν τα ανοιχτά δεδομένα είναι κομμάτι της έρευνάς σας, θα χρειαστεί αρκετές φορές να χειριστείτε διαφορετικά είδη αρχείων από τις βάσεις δεδομένων. Δυστυχώς, τις περισσότερες φορές, δεν υπάρχει η πολυτέλεια να επιλέξουμε ποιο είδος αρχείου μας ταιριάζει. Έτσι πρέπει να εξοικειωθούμε και να δουλεύουμε με όλα τα είδη αρχείων προτού φτάσουμε σε αδιέξοδο. Πάντα θα υπάρχει λύση, αν και αυτό δε σημαίνει πως θα είναι και η ευκολότερη. Παρακάτω υπάρχει ένας οδηγός για κάθε είδος αρχείου με βάση το open data handbook και με προτάσεις για το ποιες βιβλιοθήκες μπορείτε να χρησιμοποιήσετε.
Η JSON είναι μια απλή μορφή αρχείων η οποία διαβάζεται εύκολα από οποιαδήποτε γλώσσα προγραμματισμού. Η απλότητά της σημαίνει ότι είναι γενικά απλούστερο για τους υπολογιστές να την επεξεργασθούν, σε σύγκριση με άλλες, όπως η XML. Το να δουλεύεις με JSON στη Python είναι σχεδόν ίδιο με το να δουλεύεις με dictionaries. Το μόνο που θα χρειαστεί είναι η βιβλιοθήκη json, η οποία είναι προεγκατεστημένη σε κάθε python 2.6 και μετά.
import json
json_data = open("file root")
data = json.load(json_data)
Το data["key"] εκτυπώνει τα δεδομένα που αντιστοιχούν στο json αρχείο “key”.
XML χρησιμοποιείται ευρέως για την ανταλλαγή δεδομένων επειδή προσφέρει καλές προϋποθέσεις ώστε να διατηρηθεί η δομή στα δεδομένα και στον τρόπο που δομούνται τα αρχεία, και επιτρέπει στους προγραμματιστές να τεκμηριώνουν επιτόπου τα δεδομένα χωρίς να επιδρούν στην ανάγνωσή τους. Θα χρειαστείτε τη βλιβλιοθήκη minidom. Η οποία είναι προεγκατεστημένη επίσης στη python.
from xml.dom import minidom
xmldoc = minidom.parse("file root")
itemlist = xmldoc.getElementsByTagName("name")
H μεταβλητή itemlist θα περιέχει τα δεδομένα που αντιστοιχούν στην ετικέτα “name”.
Η μορφή RDF που προτείνεται από το W3C, επιτρέπει την αναπαράσταση των δεδομένων σε μορφή που κάνει ευκολότερο το συνδυασμό δεδομένων από πολλαπλές πηγές. Η RDF ενθαρρύνει τη χρήση των URL ως αναγνωριστικών, τα οποία παρέχουν έναν αξιόπιστο τρόπο διασύνδεσης υπάρχοντων ανοικτών δεδομένων από τον Ιστό. Η RDF δεν είναι προς το παρόν ευρέως διαδεδομένη, όμως είναι μια δημοφιλής τάση στις πρωτοβουλίες της Ανοικτής Διακυβέρνησης, συμπεριλαμβανομένων των έργων Συνδεδεμένων Ανοικτών Δεδομένων της Ισπανικής και της Βρετανικής Κυβέρνησης. Ο εφευρέτης του Ιστού, Tim Berners-Lee, πρόσφατα πρότεινε ένα σχήμα 5 αστέρων, το οποίο περιλαμβάνει τα διασυνδεδεμένα RDF δεδομένα ως στόχο που πρέπει να επιτευχθεί για τις πρωτοβουλίες ανοικτών δεδομένων. Χρησιμοποιώ τη βιβλιοηθήκη rdflib στο παρακάτω παράδειγμα.
from rdflib.graph import Graph
g = Graph()
g.parse("", format="")
for stmt in g:
   print(stmt)
Στη μορφή rdf μπορείτε να θέσετε ερωτήματα στα δεδομένα και να επιστρέψει μόνο αυτά που σας ενδιαφέρουν. Ωστόσο δεν είναι το ίδιο εύκολο με το να τα διαβάσετε. Στο παρακάτω link θα βρείτε τον αντίστοιχο οδηγό. tutorial
Λογιστικά φύλλα.Πολλές υπηρεσίες αφήνουν πληροφορίες στο λογιστικό φύλλο, πχ στο Microsoft Excel. Αυτά τα δεδομένα μπορούν συνήθως να χρησιμοποιηθούν άμεσα για την περιγραφή του τι αναπαριστούν οι διάφορες στήλες. Ωστόσο, σε μερικές περιπτώσεις, μπορεί να ενσωματώνονται μακροεντολές και τύποι στα λογιστικά φύλλα, τα οποία μπορεί να είναι δύσκολα στο χειρισμό. Είναι, συνεπώς, καλή τακτική να τεκμηριώνετε αυτούς τους υπολογισμούς δίπλα από το λογιστικό φύλλο, κάνοντάς το πιο προσβάσιμο για τους χρήστες που θα το διαβάσουν. Προτιμώ να χρησιμοποιήσω ένα μετατροπέα xls2csv όπου θα πάρω το ίδιο αρχείο σε csv. Παρόλα αυτά αν για τον οποιοδήποτε λόγο θέλετε να δουλέψετε με xls αρχείο, εδώ θα βρείτε την καλύτερη www.python-excel.org. Η πιο διάσημη βιβλιοθήκη είναι η xlrd. Τέλος, υπάρχει η βιβλιοθήκη openpyxl, όπου σας επιτρέπει να δουλέψετε και με xlsx αρχεία.
Αρχεία διαχωρισμένα με κόμματα (CSV) Τα αρχεία CSV αποτελούν μια πολύ χρήσιμη μορφή αρχείων, επειδή είναι συμπαγή και επομένως κατάλληλα για τη μεταφορά μεγάλων συνόλων δεδομένων που έχουν την ίδια δομή. Ωστόσο, η μορφή είναι τόσο λιτή, που τα δεδομένα είναι συνήθως άχρηστα χωρίς τεκμηρίωση, αφού είναι σχεδόν αδύνατο να μαντέψει κάποιος την σημασία των διαδόρων στηλών. Είναι, συνεπώς, εξαιρετικά σημαντικό για τη μορφή αυτή, η τεκμηρίωση των διαφορετικών πεδίων να είναι ακριβής. Επομένως είναι σημαντικό ότι η δομή του αρχείου πρέπει να ακολουθηθεί πιστά, εφόσον η παράλειψη ενός και μόνον πεδίου μπορεί να επηρεάσει αρνητικά όλα τα εναπομείναντα δεδομένα στο αρχείο, χωρίς δυνατότητα να γίνει διόρθωση, αφού δε μπορεί να υπολογιστεί πώς θα ερμηνευτούν τα εναπομείναντα δεδομένα. Μπορείτε να χρησιμοποιήσετε τη βιβλιοθήκη CSV σύμφωνα με το παρακάτω παράδειγμα.
import csv
with open('eggs.csv', 'rb') as csvfile:
   file = csv.reader(, delimiter=' ', quotechar='|')
   for row in file:
      print ', '.join(row)
Απλό κείμενο (txt) Τα έγγραφα απλού κειμένου είναι πολύ εύκολα αναγνώσιμα για τους υπολογιστές. Στη γενική περίπτωση δεν περιέχουν μεταδεδομένα δομής μέσα στο έγγραφο, κάτι που σημαίνει ότι οι προγραμματιστές πρέπει να δημιουργήσουν ειδικό αναλυτή που θα μεταγλωτίζει κάθε έγγραφο, με το που γίνεται διαθέσιμο. Κάποια προβλήματα μπορεί να προκληθούν όταν ανταλλάσσονται αρχεία απλού κειμένου μεταξύ διαφορετικών λειτουργικών συστημάτων. Τα Microsoft Windows, το Mac OS X και άλλες παραλλαγές του Unix έχουν το δικό τους τρόπο να αναγνωρίζουν ότι το κείμενο αλλάζει γραμμή. Μπορείτε να διαβάσετε το txt αρχείο, αλλά το πως θα το χρησιμοποιήσετε αργότερα εξαρτάται από τη δομή που έχει αυτό.
text_file = open("", "r")
lines = text_file.read()
Το παράδειγμα αυτό επιστρέφει ολόκληρο το κείμενο στη μεταβλητή lines.
PDF Εδώ είναι ένα από τα μεγαλύτερα προβλήματα στα διάφορα είδη αρχείων. Πολλές βάσεις δεδομένων χρησιμοποιούν τα pdf ως αρχεία τα οποία είναι δύσκολο να τα διαβάσετε και μετά να τα επεξεργαστείτε. Μπορείτε να χρησιμοποιείσετε το PDFMiner. Δε θα προσθέσω κάποιο παράδειγμα καθώς δεν είναι απλός κώδικας, ωστόσο μπορείτε να βρείτε τα πάντα στο βοηθητικό κείμενο του παραπάνω συνδέσμου.
HTML. Στις μέρες μας, πολλά δεδομένα είναι διαθέσιμα σε μορφή HTML, σε διάφορες ιστοσελίδες. Αυτό μπορεί να είναι παραπάνω από επαρκές, εάν τα δεδομένα είναι γενικά στατικά και περιορισμένης εμβέλειας. Σε μερικές περιπτώσεις, θα ήταν προτιμότερο να υπάρχουν τα δεδομένα σε μια μορφή ευκολότερη να ληφθεί τοπικά και να τροποποιηθεί, αλλά εφόσον είναι φθηνό και εύκολο να αναφερθεί κανείς σε μια σελίδα στον Ιστό, μπορεί αυτό να είναι ενα καλό ξεκίνημα για την δημοσίευση των δεδομένων. Τυπικά, θα ήταν σωστότερο να χρησιμοποιηθούν στα έγγραφα HTML πίνακες που θα περιέχουν τα δεδομένα, και μετά να δωθούν στα διάφορα πεδία αναγνωριστικά, τα οποία θα έκαναν ευκολότερη την εύρεση και την τροποποίηση των δεδομένων. Η Yahoo έχει αναπτύξει ένα εργαλείο http://developer.yahoo.com/yql/ που μπορεί να εξάγει δομική πληροφορία από μια ιστοσελίδα, και τέτοια εργαλεία μπορούν να κάνουν πολλά περισσότερα, αν η πληροφορία είναι προσεκτικά επισημασμένη. Έχω χρησιμοποιήσει αρκετές φορές τη βιβλιοθήκη με όνομα Beautiful Soup.
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_file)
soup.title
soup.title.name
soup.title.string
soup.title.parent.name
soup.p
soup.p['class']
soup.a
soup.find_all('a')
soup.find(id="link3")
Αυτά είναι μόνο λίγα από τα όσα μπορεί να κάνει η βιβλιοθήκη. Μπορείτε να βρείτε ολόκληρη λίστα στο βοηθητικό κείμενο.
Σαρωμένη εικόνα. Ναι, είναι αλήθεια. Πιθανότατα η πιο ακατάλληλη μορφή για τα περισσότερα δεδομένα, ωστόσο η μορφές TIFF και JPEG-2000 μπορούν τουλάχισστο να συνοδεύσουν τις εικόνες με τεκμηρίωση σχετική με το τι περιέχουν – ακόμα και να συνοδεύσουν ένα σαρωμένο έγγραφο με το πλήρες περιεχόμενό του σε κείμενο. Αν οι εικόνες είναι καθαρές και περιέχουν μόνο κείμενο χωρίς καθόλου θόρυβο, μπορείτε να χρησιμοποιήσετε τη βιβλιοθήκη pytesser. Προαπαιτούμενη είναι η βιβλιοθήκη PIL.
from pytesser import *
image = Image.open(“image”)  # Ανοίγει την εικόνα με τη βιβλιοθήκη PIL
print image_to_string(image)
Ιδιόκτητες μορφές. Κάποια ειδικά συστήματα, έχουν τις δικές τους μορφές δεδομένων, με τις οποίες διαβάζουν και γράφουν αρχεία. Μερικές φορές, ίσως είναι αρκετό να εκθέτετε τα δεδομένα σε τέτοια μορφή, ειδικά αν αναμένεται να χρησιμοποιηθούν σε σύστημα παρόμοιο με αυτό από το οποίο προήλθαν. Όταν είναι δυνατό να προσφερθούν επιπλέον πληροφορίες σχετικά με τέτοιες ιδιόκτητες μορφές, πρέπει να δίνονται πάντοτε, για παράδειγμα με έναν σύνδεσμο στην ιστοσελίδα του προμηθευτή. Γενικά, προτείνεται να παρέχετε τα δεδομένα σε μη ιδιόκτητες μορφές, όπου αυτό είναι δυνατόν. Προτείνω να κάνετε αναζήτηση στη google για την περίπτωση που υπάρχει βιβλιοθήκη αποκλειστικά για αυτή τη μορφή δεδομένων.
Επιπλέον πληροφορίες. Ενδεχομένως να βρείτε χρήσιμη τη βιβλιοθήκη Panda library, όπου επιτρέπει την επεξεργασία αρχείων CSV, Excel, HDF, SQL, JSON, HTML, Pickle.
- See more at: http://okfn.gr/2013/10/%ce%bf%ce%b4%ce%b7%ce%b3%cf%8c%cf%82-python-%ce%b3%ce%b9%ce%b1-%cf%84%ce%b9%cf%82-%ce%b4%ce%b9%ce%ac%cf%86%ce%bf%cf%81%ce%b5%cf%82-%ce%bc%ce%bf%cf%81%cf%86%ce%ad%cf%82-%ce%b1%cf%81%cf%87%ce%b5%ce%af/#sthash.9L3DAGvB.dpuf

Προέλευση: http://okfn.gr

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου