Διάλεξη 28ης Νοεμβρίου 2016
Αρχεία
Όλα τα υπολογιστικά συστήματα χρησιμοποιούν αρχεία (files) για να αποθηκεύσουν δεδομένα ή ενδιάμεσα αποτελέσματα από μια σειρά υπολογισμών. Η Python παρέχει πολλές ευκολίες για τη δημιουργία και επεξεργασία αρχείων.
Πρόσβαση σε ένα αρχείο παρέχεται μέσω της λεγόμενης λαβής αρχείου (file handle). Για παράδειγμα, η εντολή
fh = open('grades.txt', 'w')
ζητά από το λειτουργικό σύστημα τη δημιουργία ενός αρχείου με το όνομα grades.txt
και να
επιτρέπει πρόσβαση σε αυτό μέσω της λαβής αρχείου fh
. Το όρισμα 'w'
επισημαίνει
ότι ο χρήστης θα γράψει στο αρχείο grades.txt
δεδομένα με τη μέθοδο write
:
fh = open('grades.txt', 'w')
fh.write('John Student ' + str(5.5) + '\n')
fh.write('Jane Student ' + str(6.0))
fh.close()
Μπορούμε να διαβάσουμε τα δεδομένα του συγκεκριμένου αρχείου με τη μέθοδο read
:
fh = open('grades.txt', 'r')
for line in fh:
print(line)
fh.close()
και θα δούμε
John Student 5.5
Jane Student 6.0
Η επιπλέον γραμμή ανάμεσα στις δύο γραμμές του αρχείου οφείλεται στον χαρακτήρα αλλαγής γραμμής '\n'
ο οποίος εκτυπώθηκε στο τέλος της πρώτης γραμμής. Αν έχουμε δημιουργήσει ήδη το αρχείο grades.txt
μπορούμε
να προσθέσουμε καινούργια στοιχεία στο τέλος του με τη μέθοδο append
:
fh = open('grades.txt', 'a')
fh.write('\n')
fh.write('David Good ' + str(7.0) + '\n')
fh.write('Mary Best ' + str(7.5) + '\n')
fh.close()
Αν εκτυπώσουμε τα περιεχόμενα του αρχείου τώρα με τις εντολές
fh = open('grades.txt', 'r')
for line in fh:
print(line.rstrip())
fh.close()
θα δούμε
John Student 5.5
Jane Student 6.0
David Good 7.0
Mary Best 7.5
Παρατηρήστε ότι χρησιμοποιήσαμε τη μέθοδο rstrip
στην ακολουθία χαρακτήρων line
για να σβήσουμε
κενούς χαρακτήρες από το δεξιό άκρο της. Το ίδιο αποτέλεσμα θα μπορούσαμε να επιτύχουμε τυπώνοντας όλους τους χαρακτήρες
με εξαίρεση τον χαρακτήρα αλλαγής γραμμής, γράφοντας print(line[:-1])
.
Συνοψίζουμε παρακάτω τις σημαντικότερες λειτουργίες για την επεξεργασία αρχείων. Υποθέτουμε ότι fh
είναι μια
λαβή αρχείου και filename
είναι μια ακολουθία χαρακτήρων η οποία περιέχει το όνομα του αρχείου το οποίο
επεξεργαζόμαστε:
open(filename, 'w')
: δημιουργεί το αρχείοfilename
(αν δεν υπάρχει ήδη) και το προετοιμάζει για να δεχθεί καινούργια στοιχεία. Επιστρέφει μια λαβή στο συγκεκριμένο αρχείο.open(filename, 'r')
: ανοίγει το αρχείοfilename
(αν υπάρχει) και το προετοιμάζει για ανάγνωση στοιχείων. Επιστρέφει μια λαβή στο συγκεκριμένο αρχείο.open(filename, 'a')
: ανοίγει το αρχείοfilename
και το προετοιμάζει για να δεχθεί καινούργια στοιχεία. Επιστρέφει μια λαβή στο συγκεκριμένο αρχείο.fh.read()
: επιστρέφει μια ακολουθία χαρακτήρων με τα περιεχόμενα του αρχείου με λαβήfh
.fh.readline()
: επιστρέφει ως ακολουθία χαρακτήρων την επόμενη γραμμή του αρχείου με λαβήfh
.fh.readlines()
: επιστρέφει μια λίστα στοιχεία της οποίας είναι οι γραμμές του αρχείου με λαβήfh
.fh.write(s)
: γράφει την ακολουθία χαρακτήρων s στο αρχείο με λαβήfh
.fh.writeLines(S)
: γράφει κάθε στοιχείο της ακολουθίας S στο αρχείο με λαβήfh
.fh.close()
: κλείνει το αρχείο με λαβήfh
.
Ως εφαρμογή των παραπάνω παρουσιάζουμε μια υλοποίηση του παιχνιδιού «κρεμάλα». Το πρόγραμμα επιλέγει, τυχαία, μια λέξη
από το αρχείο 'words.txt'
και ο χρήστης προσπαθεί να την βρεί. Η βιβλιοθήκη random
περιέχει συναρτήσεις
για την παραγωγή τυχαίων αριθμών. Στις εντολές που ακολουθούν, οι λέξεις του αρχείου 'words.txt'
αποθηκεύονται στη
λίστα words
:
import random
fh = open('words.txt', 'r')
words = fh.readlines()
fh.close()
Στη συνέχει το πρόγραμμα επιλέγει τυχαία μια λέξη από τη λίστα words
και καλεί το χρήστη να επιλέξει κάποιο
γράμμα το οποίο περιέχεται στη λέξη. Το πρόγραμμα επιτρέπει το πολύ 7 λάνθασμένες επιλογές γραμμάτων (δείτε την ανακύκλωση
while
):
idx = random.randint(0,len(words)-1)
word = words[idx].rstrip()
play = list('_' * len(word))
tried = ''
ntried = 0
maxfails = 7
nfails = 0
# Let's play
while nfails < maxfails:
print()
print('I am thinking of the ' + str(len(word)) + '-letter word ' + ' '.join(play))
if ntried > 0:
print('Past choices:', tried)
ch = input('Make a choice: ')
Το πρόγραμμα ελέγχει αν ο χαρακτήρας που έδωσε ο χρήστης είναι όντως γράμμα και στη συνέχεια ελέγχει αν εμφανίζεται στη λέξη. Στην περίπτωση αυτή εμφανίζει την επιτυχή επιλογή στη σωστή της θέση ή θέσεις. Στο τέλος κάθε επανάληψης ελέγχεται αν ο χρήστης έχει βρεί τη λέξη:
if ch not in 'abcdefghijklmnopqrstuvwxyz':
print('Not a letter. Try again.')
continue
if ch in tried:
print(''Already entered ' + ch)
continue
tried += ch
ntried += 1
nsubs = 0
for i in range(len(word)):
if word[i] == ch:
play[i] = ch
nsubs += 1
if nsubs == 0:
print('Not in word. Try again')
nfails += 1
continue
if ''.join(play) == word: break
# end of game play
print()
if nfails == maxfails:
print('The word was', word)
print('Better luck next time!')
else:
print('Congratulations! You found it!')
Ο ενδιαφερόμενος αναγνώστης μπορεί να δοκιμάσει το παιχνίδι κρεμάλα με το αρχείο λέξεων words.txt.