Φροντηστήριο Διαχείριση Περιεχομένου Παγκόσμιου Ιστού και Γλωσσικά Eργαλεία
Αρχείο Εισόδου
Άνοιγμα αρχείων open(filename, mode) – Το πρώτο όρισμα είναι τύπου string και περιέχει το όνομα του αρχείου (ή και το path κάτω από το οποίο αυτό υπάρχει). – Το δεύτερο όρισμα είναι επίσης τύπου string και υποδηλώνει τον τρόπο με τον οποίο θα χρησιμοποιηθεί το αρχείο. – 'r' (read - default) – 'w' (write) – 'a' (append) – 'r+' (both read/write) Παράδειγμα: – >>> f = open('/tmp/workfile', 'r')
Ανάγνωση περιεχομένου (1) f.read(size) – Η παράμετρος size είναι προεραιτική και υποδηλώνει πόσα bytes θα διαβαστούν από το αρχείο f (file object). – Είναι ευθύνη του προγραμματιστή να καθορίσει την τιμή της size. Αν δεν δοθεί τιμή, η read διαβάζει ολόκληρο το περιεχόμενο!! – Μεγάλη προσοχή στην χρήση της!! Η μνήμη δεν είναι άπειρη... Παράδειγμα: – >>> f.read() – 'This is the entire file.\n' – >>> f.read() – ' '
Ανάγνωση περιεχομένου (2) f.readline() – Ανάγνωση μίας γραμμής από το αρχείο. Ως delimeter χρησιμοποιείται ο χαρακτήρας νέας γραμμής ('\n'). – Το επιστρεφόμενο string περιέχει τον χαρακτήρα νέας γραμμής εκτός και αν πρόκειται για το τέλος του αρχείου, το οποίο δεν τελειώνει με νέα γραμμή!! – Προσοχή στην επιστρεφόμενη τιμή!! Ένα κενό string είναι το τέλος του αρχείου ενώ ένα string της μορφής '\n' είναι μία κενή γραμμή!! Παράδειγμα: – >>> f.readline() – 'This is the first line of the file.\n' – >>> f.readline() – 'Second line of the file\n' – >>> f.readline() – ' '
Ανάγνωση περιεχομένου (3) f.readlines(sizehint) – Επιστρέφει μία λίστα, όπου κάθε στοιχείο της είναι μία γραμμή του αρχείου. – Η παράμετρος sizehint είναι προεραιτική και συνίσταται για πραγματικά μεγάλα αρχεία, με σκοπό την καλύτερη διαχείρηση μνήμης. Αναφέρεται σε bytes, αλλά η συνάρτηση θα επιστρέψει μόνο ολόκληρες γραμμές. Παράδειγμα: – >>> f.readlines() – ['This is the first line of the file.\n', 'Second line of the file\n']
Ανάγνωση περιεχομένου (4) >>> for line in f: print line This is the first line of the file. Second line of the file Διαφορετικό buffering στην μνήμη!! Δεν πρέπει να χρησιμοποιείται σε συνδυασμό με τις προηγούμενες μεθόδους. Προσπέλαση ανά γραμμή χωρίς την χρήση συνάρτησης. Η καλύτερη προσέγγιση. Καλύτερη διαχείρηση μνήμης, γρήγορη, απλή, κατανοητός κώδικας.
Ανάγνωση περιεχομένου (5) >>> with open('/tmp/workfile', 'r') as f:... read_data = f.read() >>> f.closed True Η προσέγγιση αυτή έχει το πλεονέκτημα ότι το αρχείο κλείνει κανονικά ακόμα και αν προκύψει exception. Επίσης, οδηγεί σε μικρότερο κώδικα από την χρήση try-finally blocks.
Εγγραφή f.write(string) – Τόσο απλά!! – Για εγγραφή άλλου τύπου δεδομένων, π.χ. int, πρέπει να γίνει πρώτα μετατροπή σε string, π.χ.: a = 5 s = str(a) f.write(s) – Hint: Προσοχή κατά την αντίστοιχη ανάκτηση και χρήση αριθμών από αρχεία. Πρέπει να γίνει μετατροπή σε int πριν την χρήση τους σε μαθηματικές πράξεις..
Κλείσιμο αρχείων f.close() – Τόσο απλά!! – Όταν τελειώσουμε με το αρχείο εκτελούμε την παραπάνω εντολή για την αποδέσμευση μνήμης και την αποφυγή περίεργων καταστάσεων...
Exceptions (1) Κατά το άνοιγμα/κλείσιμο ή κατά την ανάγνωση/ εγγραφή ενός αρχείου οτιδήποτε μπορεί να πάει στραβά.. (“Νόμος του Murphy για το I/O.”) Χρησιμοποιούμε χειρισμό εξαιρέσεων για την αποφυγή “βίαιου” τερματισμού της εκτέλεσης του προγράμματός μας. Ο τύπος exception που γίνεται “throw” σε αυτές τις περιπτώσεις είναι ο IOError.
Exceptions (2) Γενική μορφή try block: – try:... except IOError: pass finally...
Exceptions (3) Παράδειγμα: – try: f = open(path.mode) f.readlines()... except IOError: pass finally … f.close()
Trie
Υλοποίηση Trie (1) class Trie: def __init__(self): self.root = [None, {}] def add(self, key, value): curr_node = self.root for ch in key: curr_node = curr_node[1].setdefault(ch, [None, {}]) curr_node[0] = value >>> t = Trie() >>> t.add("chat", "cat") [None, {'c': [None, {'h': [None, {'a': [None, {'i': [None, {'r': ['flesh', {}]}], 't': ['cat', {}]}], 'i': [None, {'c': ['stylish', {}], 'e': [None, {'n': ['dog', {}]}]}]}]}]}]
Υλοποίηση Trie (2) def insert (trie, key, value): if key: first, rest = key[0], key[1:] if first not in trie: trie[first] = {} insert(trie[first], rest, value) else: trie['value'] = value >>> trie = defaultdict(dict) >>> insert(trie,'chat','cat') {'c': {'h': {'a': {'i': {'r': {'value': 'flesh'}}, 't': {'value': 'cat'}}, 'i': {'c': {'value': 'stylish'}, 'e': {'n': {'value': 'dog'}}}}}}
Dictionaries Δομή αναζήτησης (ΜΗ ταξινομημένη), κρατάει στοιχεία τύπου key:value Παράδειγμα: – >>> tel = {'jack': 4098, 'sape': 4139} Ανάκτηση κλειδιών: – >>> tel.keys() – ['guido', 'sape'] Αναζήτηση κλειδιού: – >>> 'guido' in tel – True Iteration: – >>> for k, v in knights.iteritems(): –... print k, v – jack 4098 – sape 4139
Lists (1) Ταξινομημένη δομή Μπορεί να χρησιμοποιηθεί ως σωρός, ουρά. Παράδειγμα: – a = [66.25, 333, 333, 1, ] Πλήθος συναρτήσεων: list.append(x) Προσθέτει το στοιχείο x στο τέλος της λίστας. list.extend(L) Επεκτείνει το τέλος της λίστας κατά L στοιχεία. list.insert(i, x) Τοποθετεί το στοιχείο x στην θέση i της λίστας.
Lists (2) list.remove(x) Αφαιρεί την πρώτη εμφάνιση του x. list.pop([i]) Επιστρέφει και αφαιρεί το στοιχείο της θέσης i από την λίστα. Η παράμετρος i είναι προεραιτική και αν δεν δοθεί, το στοιχείο αφαιρείται από το τέλος της λίστας. list.index(x) Εποστρέφει τον δείκτη της πρώτης εμφάνισης του x. list.count(x) Μετράει τις εμφανίσεις του x στην λίστα. list.sort() Ταξινομεί τα στοιχεία της λίστας. list.reverse() Αντιστρέφει τα στοιχεία της λίστας.
Strings (1) str.strip([chars]) – Αφαιρεί τα κενά από την αρχή και το τέλος του str. str.upper() – Επιστρέφει ένα αντίγραφο του string με όλους τους χαρακτήρες του κεφαλαία. str.lower() – Επιστρέφει ένα αντίγραφο του string με όλους τους χαρακτήρες του μικρά. str.endswith(suffix[, start[, end]]) – Επιστρέφει true αν το str τελειώνει με το επίθεμα suffix. Το suffix μπορεί να είναι tuple από πιθανά επιθέματα ενώ μπορεί προαιρετικά να δοθούν όρια αναζήτησης start και stop.
Strings (2) str.find(sub[, start[, end]]) – Επιστρέφει τον δείκτη πρώτης εμφάνισης του sub, αλλιώς -1. str.index(sub[, start[, end]]) – Ίδια με την find αλλά επιστρέφει ValueError. str.join(iterable) – Συνενώνει το str με το iterable. str.replace(old, new[, count]) – Επιστρέφει ένα αντίγραφο του string όπου το old αντικαθίσταται από το new (προεραιτικά count φορές).