5 η Διάλεξη Python - Αρχεία
Αρχεία Άνοιγμα Επεξεργασία Κλείσιμο
Αρχεία Η python κάνει διάκριση μεταξύ αρχείων κειμένου (text) και δυαδικών αρχείων (binary) Τα δεδομένα στα αρχεία κειμένου χωρίζονται μεταξύ τους με το χαρακτήρα αλλαγής γραμμής. Στα συστήματα Unix/Linux είναι ο \n ενώ στα windows \r\n To άνοιγμα ενός αρχείου γίνεται με την ενσωματωμένη συνάρτηση open: open(name[,mode]) Η εντολή open για το άνοιγμα ενός αρχείου δημιουργεί ένα αντικείμενο για το άνοιγμα του αρχείου: file object = open(file_name [, access_mode][, buffering]) file_name: Το όνομα του αρχείου που θέλουμε να προσπελάσουμε access_mode: Καθορίζει τη κατάσταση για την οποία θα ανοίξουμε το αρχείο: Διάβασμα (read), εγγραφή (write), προσθήκη (append) κλπ. Η προκαθορισμένη τιμή είναι η read buffering: εάν δώσουμε 0 δεν θα έχουμε ενδιάμεση μνήμη εάν δώσουμε 1 η ενδιάμεση μνήμη θα σχηματοποιηθεί κατά τη διάρκεια προσπέλασης του αρχείου.
Αρχεία Αρχικά ανοίγετε ένα αρχείο χρησιμοποιώντας την ενσωματωμένη συνάρτηση open καθορίζοντας την ονομασία του αρχείου και τον τρόπο με τον οποίο θέλουμε να ανοίγει το αρχείο. Ο τρόπος μπορεί να είναι με διάβασμα ('r', read mode), με γράψιμο ('w', write mode) ή με πρόσθεση ('a', append mode). Μπορούμε επίσης να χειριστούμε ένα αρχείο κειμένου ('t', text file) ή ένα δυαδικό αρχείο ('b', binary file). Στην πραγματικότητα υπάρχουν πάρα πολλοί τρόποι διαθέσιμοι και η help(open) θα σας δώσει περισσότερες λεπτομέρειες γι αυτούς. Από προεπιλογή η open() θεωρεί το αρχείο ως αρχείο κειμένου ('text file) και το ανοίγει με τον τύπο read.
r w a t b Αρχεία Το όρισμα mode είναι προαιρετικό και καθορίζει τον τρόπο προσπέλασης του αρχείου Πχ η αν δώσουμε w+b δημιουργούμε ένα δυαδικό αρχείο για ανάγνωση και εγγραφή n=open( test.dat ) Ανοίγει αρχείο κειμένου για ανάγνωση (προεπιλεγμένη τιμή) Ανοίγει ένα αρχείο κειμένου για γράψιμο. Αν το αρχείο υπάρχει τα περιεχόμενά του διαγράφονται Ανοίγει ένα αρχείο κειμένου για προσθήκη, προσθέτοντας τα νέα δεδομένα στο τέλος του αρχείου. Αν το αρχείο δεν υπάρχει το δημιουργεί Χειρισμός ως αρχείου κειμένου (προεπιλεγμένη τιμή) Χειρισμός ως δυαδικό αρχείο (binary file) + Ανάγνωση και γράψιμο. Προσθήκη εγγραφής στην ανάγνωση (r+)και το αντίστροφο (w+) f.close() : γράφει όλα τα μη αποθηκευμένα δεδομένα στο αρχείο και κλείνει το αρχείο ελευθερώνοντας τους δεσμευμένους πόρους που σχετίζονται μαζί του
Παράδειγμα
Αρχεία Το διάβασμα από ένα αρχείο γίνεται με τη μέθοδο read([size]) Το προαιρετικό αριθμητικό [size] καθορίζει το πλήθος των bytes που θα διαβαστούν από το αρχείο. Αν το παραλείψουμε η read διαβάζει ολόκληρο το αρχείο. Όταν εντοπιστεί το τέλος του αρχείου η μέθοδος επιστρέφει ένα κενό αλφαριθμητικό Η μέθοδος readline() χρησιμοποιείται για το διάβασμα μιας γραμμής από το αρχείο Η μέθοδος αυτή κάθε φορά που εκτελείται διαβάζει την επόμενη γραμμή. Η readline() επιστρέφει τη γραμμή που διάβασε προσθέτοντας τον χαρακτήρα αλλαγής γραμμής στο τέλος της. Αν κληθεί με το προαιρετικό όρισμα [size] επιστρέφει τους πρώτους size χαρακτήρες της γραμμής προσθέτοντας πάντας τον χαρακτήρα αλλαγής γραμμής. Όταν εντοπιστεί το τέλος του αρχείου επιστρέφει ένα κενό αλφαριθμητικό
Παραδείγματα
Παράδειγμα
Αρχεία Για να γράψουμε σε ένα αρχείο δεδομένα που δεν είναι αλφαριθμητικά τα μετατρέπουμε χρησιμοποιώντας τη συνάρτηση str(). Μπορούμε να χρησιμοποιήσουμε και τη str.format() ή τους προσδιοριστές μορφοποίησης %
Αρχεία Η μέθοδος tell() μας επιστρέφει τη τρέχουσα θέση στο αρχείο με άλλα λόγια τη θέση που θα διαβάσει η επόμενη εντολή read ή θα γράψει η επόμενη εντολή write. Η μέθοδος seek(offset[, from]) αλλάζει τη θέση αναφορά μέσα στο αρχείο. Η παράμετρος offset τον αριθμό των bytes που θα μετακινηθούν, ενώ η παράμετρος from καθορίζει τη θέση από την από την οποία θα μετακινηθούν τα bytes Η μέθοδος fileno(): Επιστρέφει έναν ακέραιο, που περιγράφει το αρχείου (file descriptor) και χρησιμοποιείται από το ΛΣ (το 0 αντιστοιχεί στην προκαθορισμένη είσοδο, το 1 στην προκαθορισμένη έξοδο και το 2 στην προκαθορισμένη έξοδο λαθών) Η μέθοδος next() : Επιστρέφει κάθε φορά την επόμενη γραμμή του αρχείου Η μέθοδος readlines(): Διαβάζει όλες τις γραμμές του αρχείου σε μια λίστα Η μέθοδος truncate([size]) : Περικόπτει το μέγεθος ενός αρχείου κατά [size] bytes από την τρέχουσα θέση. Χωρίς το προαιρετικό [size] το αρχείο μηδενίζεται.
Αρχεία
Αρχεία Η εντολή with: ένας σύντομος τρόπος για άνοιγμα και κλείσιμο ενός αρχείου Η εντολή with θα κλείσει αυτόματα το αρχείο μόλις ολοκληρωθούν όλες οι εντολές του μπλοκ της. Το κλείσιμο θα γίνει ανεξάρτητα από τον τρόπο εξόδου από το μπλοκ. Στα αρχεία κειμένου η μετακίνηση γίνεται μόνο αναφορικά από την αρχή του αρχείου. Εξαίρεση αποτελεί η μετακίνηση στο τέλος του αρχείου με seek(0,2).
Αρχεία Για να χειριστούμε δυαδικά αρχεία προσθέτουμε στην παράμετρο mode της συνάρτησης open το b για binary προσπέλαση f=open( onoma.dat, rb ) άνοιγμα δυαδικού για διάβασμα
Αρχεία -CSV Τα αρχεία CSV (comma Separated Values) χρησιμοποιούνται κυρίως για την ανταλλαγή δεδομένων μεταξύ διαφορετικών εφαρμογών. Συνήθως η πρώτη γραμμή περιέχει τα ονόματα των πεδίων και στη συνέχεια ακολουθούν τα δεδομένα. H python διαθέτει τη μονάδα csv που παρέχει διάφορες συναρτήσεις για το χειρισμό αρχείων csv Το αντικείμενο reader υλοποιεί το πρωτόκολλο iterator, οπότε η ανάγνωση κάθε γραμμής γίνεται μέσο επανάληψης Η παράμετρος delimiter καθορίζει το διαχωριστικό χαρακτήρα. Κάθε γραμμή που διαβάζεται επιστρέφεται ως λίστα αλφαριθμητικών. Η εντολή print(,.join(row)) τυπώνει ένα ενιαίο αλφαριθμητικό. Η μέθοδος join() δημιουργεί ένα αλφαριθμητικό από τα στοιχεία μιας λίστας χρησιμοποιώντας ως διαχωριστικό τους χαρακτήρες που καθορίζουμε
Αρχεία -CSV Αν θέλουμε να εμφανίσουμε τα περιεχόμενα του αρχείου χωρίς τα ονόματα των πεδίων ο κώδικας γίνεται: Με τη συνάρτηση enumerate(iterable[,start=0]) μας επιστρέφεται τη θέση κάθε στοιχείου, έτσι στη θέση i=0 είναι τα ονόματα των πεδίων και με την εντολή continue τα παραλείπουμε.
Αρχεία -CSV Για να γράψουμε σε ένα αρχείο csv χρησιμοποιούμε το αντικείμενο write: Αν έχουμε περισσότερα δεδομένα να γράψουμε στο αρχείο (πχ μια λίστα από λίστες) μπορούμε να χρησιμοποιήσουμε μια επαναληπτική δομή for:
Pickle Η μονάδα pickle μας παρέχει μεθόδους για να αποθηκεύουμε σύνθετα δεδομένα σε αρχεία (πχ μια λίστα ή ένα λεξικό). Διαθέτει 2 βασικές μεθόδους: dump(): αποθηκεύει ένα αντικείμενο στο αρχείο load(): ανακτά ένα αντικείμενο από το αρχείο.
Pickle Το επόμενο πρόγραμμα δημιουργεί το αρχείο phones.shv (αν δεν υπάρχει) και θα αποθηκεύσει σε αυτό 3 λίστες. Η μονάδα shelve μας δίνει τη δυνατότητα να αποθηκεύσουμε δεδομένα σε ένα αρχείο μαζί με ένα κλειδί.
Αρχεία Renaming and Deleting Files: κάνουμε εισαγωγή της βιβλιοθήκης import os os.rename(current_file_name, new_file_name) os.delete(file_name) Δημιουργία καταλόγου : os.mkdir("newdir") Αλλαγή τρέχοντος καταλόγου os.chdir("newdir") Προβολή τρέχοντος καταλόγου os.getcwd() Διαγραφή καταλόγου os.rmdir('dirname')
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Η standard διεπαφη της python για βάσεις δεδομένων βασίζεται στο DB-API Python Database API υποστηρίζει ένα ευρύ φάσμα βάσεων δεδομένων GadFly msql MySQL PostgreSQL Microsoft SQL Server 2000 Informix Interbase Oracle Sybase
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Πρέπει να κατεβάσουμε ξεχωριστό DB API για κάθε βάση που θέλουμε να προσπελάσουμε Αν θέλουμε να προσπελάσουμε μια βάση της Oracle καθώς και μια βάση της MySQL πρέπει να κατεβάσουμε τα αρθρώματα (DB-API) τόσο για την Oracle όσο και για την MySQL Το DB API μας εφοδιάζει με ένα μίνιμουμ στάνταρντ για να δουλέψουμε με βάσεις χρησιμοποιώντας της δομές της Python και τη σύνταξη της python όπου αυτό είναι δυνατό. Το API περιλαμβάνει τα ακόλουθα: Εισαγωγή (Import) του api module. Σύνδεση με τη βάση. SQL δηλώσεις και διαδικασίες. Κλείσιμο της σύνδεσης MySQLdb είναι μια διεπαφή για την σύνδεση με έναν εξυπηρετητή μιας MySQL database μέσα από τη python.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ας θωρήσουμε μια βάση δεδομένων η οποία θα περιλαμβάνει τα εξής: Ονομάζουμε τη βάση μας «TESTDB» Δημιουργούμε έναν πίνακα στη βάση με όνομα «EMPLOYEE» Ο πίνακας θα έχει τα πεδία: FIRST_NAME, LAST_NAME, AGE, SEX and INCOME. Φτιάχνουμε ένα User ID "testuser" με password "test123" ο οποίος θα έχει πρόσβαση στη βάση Βεβαιωνόμαστε ότι το Python module MySQLdb είναι εγκατεστημένο
Παράδειγμα import MySQLdb # Ανοίγουμε τη βάση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # προετοιμάζουμε έναν αντικείμενο «cursor» χρησιμοποιώντας τη μέθοδο cursor() cursor = db.cursor() # εκτελούμε ένα SQL ερώτημα χρησιμοποιώντας τη μέθοδο execute() cursor.execute("select VERSION()") # Ανακτούμε μια γραμμή με τη μέθοδο fetchone() data = cursor.fetchone() print "Database version : %s " % data # αποσύνδεση από το server db.close()
Δημιουργία Πίνακα στη βάση: import MySQLdb # δημιουργία σύνδεσης με τη βάση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # ετοιμάζουμε ένα αντικείμενο «cursor» χρησιμοποιώντας τη μέθοδο cursor() cursor = db.cursor() # αν ο πίνακας υπάρχει τον απορρίπτουμε με τη μέθοδο execute() cursor.execute("drop TABLE IF EXISTS EMPLOYEE") # Δημιουργία πίνακα με τα πεδία του sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # αποσύνδεση db.close()
INSERT Τη λειτουργία Insert τη χρησιμοποιούμε όταν θέλουμε να εισάγουμε δεδομένα στη βάση μας: import MySQLdb # Σύνδεση στη βάση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # ετοιμάζουμε ένα αντικείμενο «cursor» χρησιμοποιώντας τη μέθοδο cursor() cursor = db.cursor() # φτιάχνουμε ένα ερώτημα SQL χρησιμοποιώντας τη μέθοδο INSERT για να εισάγουμε δεδομένα στη βάση sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # εκτελούμε την εντολή cursor.execute cursor.execute(sql) # αποθηκεύουμε της αλλαγές στη βάση db.commit() except: # επιστροφή στην περίπτωση λάθους db.rollback() # αποσύνδεση db.close()
INSERT Το προηγούμενο παράδειγμα μπορεί να ξαναγραφτεί έτσι ώστε να δημιουργήσουμε ένα δυναμικό sql ερώτημα: import MySQLdb # Σύνδεση στη βάση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # προετοιμασία ενός αντικειμένου cursor με τη μέθοδο cursor() cursor = db.cursor() # Προετοιμασια ερωτήματος SQL για την εισαγωγή εγγραφής στη βάση. sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ ('Mac', 'Mohan', 20, 'M', 2000) try: # εκτέλεση της εντολής cursor.execute(sql) # αποθηκεύουμε της αλλαγές στη βάση db.commit() except: # επιστροφή στην περίπτωση λάθους db.rollback() # αποσύνδεση db.close()
READ Την εντολή read τη χρησιμοποιούμε για να διαβάσουμε πληροφορίες από τη βάση μας. Αφού κάνουμε σύνδεση στη βάση μας και χρησιμοποιούμε μια εκ των δύο μεθόδων που περιγράφονται παρακάτω; fetchone(): κάθε κλήση της μεθόδου θα μας επιστρέψει μια εγγραφή από τη βάση. fetchall(): κάθε κλήση της μεθόδου θα μας επιστρέψει πολλαπλές εγγραφές rowcount: μας επιστρέφει των αριθμό των εγγραφών οι οποίες επηρεάζονται από την εκτέλεση της εντολής execute
READ Παράδειγμα import MySQLdb # Κάνουμε σύνδεση db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # προετοιμάζουμε ένα αντικείμενο cursor χρησιμοποιώντας τη μέθοδο cursor() cursor = db.cursor() # Προετοιμασία ερωτήματος SQL για να κάνουμε INSERT μια εγγραφή στη βάση. sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (1000) try: # Εκτελούμε την εντολή SQL cursor.execute(sql) # φέρνουμε όλες της εγγραφές σε μια λίστα. results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # τυπώνουμε τις εγγραφές που ανακτήσαμε print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income ) except: print "Error: unable to fecth data" # αποσύνδεση από server db.close()
Update Η λειτουργία update χρησιμοποιείται για την ενημέρωση μιας ήδη υπάρχουσας εγγραφής στη βάση δεδομένων import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to UPDATE required records sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
Delete Με την εντολή delete διαγράφουμε εγγραφές από τη βάση μας: import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to DELETE required records sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
Παράδειγμα Να φτιαχτεί πρόγραμμα που θα γράφει τα δεδομένα ενός λεξικού σε ένα αρχείο. Κάθε στοιχείο του λεξικού θα είναι σε ξεχωριστή γραμμή και το κλειδί με την αντίστοιχη τιμή θα χωρίζονται με κόμμα. Στη συνέχεια να φτιαχτεί πρόγραμμα που διαβάζει το αρχείο και δημιουργεί το αντίστοιχο λεξικό
Παράδειγμα Το επόμενο παράδειγμα δείχνει τη χρήση των κλάσεων DictWriter και DictReader για τη δημιουργία ενός αρχείου csv από στοιχεία λεξικού καθώς και το διάβασμα του αρχείου αυτού.