File di testo

Come leggere e scrivere su file di testo.

Spesso i programmi devono elaborare una notevole mole di dati. Il luogo migliore dove memorizzare dati è nel disco sotto forma di file, il programma deve dunque essere in grado di leggere e scrivere informazioni su file. In un file i dati possono essere memorizzati in diversi modi, noi vedremo i file di testo. Un file di testo è memorizzato sul disco con un suo nome e contiene stringhe separate le une dalle altre da simboli di fine linea.

Proviamo a realizzare il gioco della maestra. Il programma fa delle domande, legge le risposte e controlla se sono giuste o meno. Le domande e le risposte le memorizziamo in un file di testo:

Io scrivo il nome di uno stato, tu devi scrivere il nome della capitale.
Italia        Roma
Francia       Parigi
Gran Bretagna Londra
...

Salviamo questo file con il nome “capitali.dat”.

Alcune osservazioni:

  1. Ho deciso che la consegna viene scritta in un’unica riga, la prima.
  2. Nelle righe successive ci sono le domande e le risposte separate da un carattere che non deve essere presente né nelle domande né nelle risposte, io ho scelto il carattere di tabulazione.
  3. Il semplice programma che scriveremo non prevede righe vuote o righe di commento.
  4. Il file deve essere un file di testo semplice, non deve contenere informazioni relative al formato, ma soltanto caratteri ascii.

Ora scriviamo il programma che legge il file:

def gioco01(nomefile):
    file_dati = file(nomefile+".dat")
    dati = file_dati.readlines()
    print dati

Ora abbiamo una lista di stringhe, stampiamo la prima e avviamo un ciclo sulle altre. In questo ciclo dobbiamo spezzare la stringa in due dove c’è il tabulatore. La prima parte conterrà la domanda e la seconda la soluzione. Alcune osservazioni:

  1. La funzione richiede come argomento una stringa contenente il nome del file senza estensione.

  2. Nella prima riga: al nome del file viene aggiunta l’estensione: nomefile+".dat", poi viene creato un oggetto file associato al nome file_dati.

  3. Vengono lette tutte le sue linee in una lista di stringhe: dati = file_dati.readlines().

  4. L’ultima riga serve per vedere cosa abbiamo effettivamente letto.

    def gioco02(nomefile):
        file_dati = file(nomefile+".dat")
        dati = file_dati.readlines()
        print dati[0]
        for linea in dati[1:]:
            ese = linea.split("\t")
            domanda = ese[0]
            soluzione = ese[1][:-1]
            print "%s --> %s" % (domanda, soluzione)
    

Osservate che la seconda parte della riga contiene anche il carattere di a capo, lo eliminiamo, prima di associarlo alla variabile soluzione con l’istruzione: soluzione=ese[1][:-1]. Conviene provare il funzionamento inserendo un bel print... Ora aggiungiamo le variabili che permettano di conteggiare le risposte giuste e sbagliate e dentro nel ciclo il codice che ponga la domanda e memorizzi la risposta, che faccia il confronto tra la risposta e la soluzione. Alla fine del ciclo ci facciamo dire quante risposte giuste e sbagliate abbiamo dato e facciamo scrivere questa informazione in un file con lo stesso nome dei dati, ma con un’altra estensione:

def gioco03(nomefile):
    file_dati = file(nomefile+".dat")
    dati = file_dati.readlines()
    giuste = 0
    sbagliate = 0
    print dati[0]
    for linea in dati[1:]:
        ese = linea.split("\t")
        domanda = ese[0]
        soluzione = ese[1][:-1]
        risposta = raw_input(domanda+" -> ")
        if risposta == soluzione:
            print "Giusto!"
            giuste += 1
        else:
            print "Sbagliato, la soluzione è:", soluzione
            sbagliate += 1
    tot = giuste+sbagliate
    risultati = "Hai dato %s risposte giuste su %s (%s%%)" \
            % (giuste, tot, float(giuste)/tot*100)
    print risultati
    file(nomefile+".res", "w").write(risultati)

Alcune osservazioni:

  1. Per scrivere in un file, bisogna aprirlo in scrittura, aggiungendo, l’argomento “w”.
  2. Nell’ultima riga, viene creato un oggetto file e viene scritta la stringa al volo senza usare variabili.
  3. Se tento di aprire in lettura un file inesistente, ottengo un errore.
  4. Se apro in scrittura un file inesistente, viene creato. Se esiste già, viene cancellato il suo contenuto.

Riassumendo

  • Il comando file permette di aprire, in lettura o in scrittura un file, la sintassi è:

    file(<nomefile>[, "w"])
    
  • Per leggere tutto un file di testo si può usare il metodo <file>.readlines() e per scrivere una stringa in un file di testo <file>.write(<stringa>).

Prova tu

  1. Crea altri esercizi.
  2. Scrivi un programma che legga un file di testo e ne scriva un altro con le righe numerate.
  3. Scrivi un programma che legga un file e ne scriva un altro crittografato.