Διάλεξη 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 είναι μια ακολουθία χαρακτήρων η οποία περιέχει το όνομα του αρχείου το οποίο επεξεργαζόμαστε:

Ως εφαρμογή των παραπάνω παρουσιάζουμε μια υλοποίηση του παιχνιδιού «κρεμάλα». Το πρόγραμμα επιλέγει, τυχαία, μια λέξη από το αρχείο '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.