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:
- Ho deciso che la consegna viene scritta in un’unica riga, la prima.
- 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.
- Il semplice programma che scriveremo non prevede righe vuote o righe di commento.
- 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:
La funzione richiede come argomento una stringa contenente il nome del file senza estensione.
Nella prima riga: al nome del file viene aggiunta l’estensione:
nomefile+".dat"
, poi viene creato un oggetto file associato al nomefile_dati
.Vengono lette tutte le sue linee in una lista di stringhe:
dati = file_dati.readlines()
.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:
- Per scrivere in un file, bisogna aprirlo in scrittura, aggiungendo, l’argomento “w”.
- Nell’ultima riga, viene creato un oggetto file e viene scritta la stringa al volo senza usare variabili.
- Se tento di aprire in lettura un file inesistente, ottengo un errore.
- 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
- Crea altri esercizi.
- Scrivi un programma che legga un file di testo e ne scriva un altro con le righe numerate.
- Scrivi un programma che legga un file e ne scriva un altro crittografato.