• Non ci sono risultati.

Conteggio di lettere

Nel documento Pensare da informatico (pagine 122-127)

Nel capitolo 7 abbiamo scritto una funzione che conta il numero di lettere in una stringa. Una possibile estensione `e la creazione di un istogramma della stringa per mostrare la frequenza di ciascuna lettera.

104 Dizionari

Questo tipo di istogramma pu`o essere utile per comprimere un file di testo: dato che le lettere compaiono con frequenza diversa possiamo usare codici brevi per le lettere pi`u frequenti e codici via via pi`u lunghi per le meno frequenti. I dizionari permettono di realizzare istogrammi in modo elegante: >>> ConteggioLettere = {}

>>> for Lettera in "Mississippi":

... ConteggioLettere [Lettera] = ConteggioLettere.get \ (Lettera, 0) + 1 ...

>>> ConteggioLettere

{’M’: 1, ’s’: 4, ’p’: 2, ’i’: 4}

Siamo partiti con un dizionario vuoto e per ogni lettera della stringa abbia-mo incrementato il corrispondente conteggio. Alla fine il dizionario contiene coppie formate da lettera e frequenza e queste coppie rappresentano il nostro istogramma.

Pu`o essere pi`u interessante mostrare l’istogramma in ordine alfabetico, e in questo caso facciamo uso dei metodi items e sort:

>>> ConteggioLettere = ConteggioLettere.items() >>> ConteggioLettere.sort()

>>> print ConteggioLettere

[(’M’, 1), (’i’, 4), (’p’, 2), (’s’, 4)]

Abbiamo visto gi`a il metodo items ma sort `e il primo metodo che incontriamo ad essere applicabile alle liste. Ci sono parecchi altri metodi applicabili alle liste (tra gli altri append, extend e reverse). Puoi consultare la documentazione di Python per avere ulteriori informazioni a riguardo.

10.8 Glossario

Dizionario: collezione di coppie chiave-valore dove si associa ogni chiave ad un valore. Le chiavi devono essere immutabili; i valori possono essere di qualsiasi tipo.

Chiave: valore usato per cercare una voce in un dizionario. Coppia chiave-valore: elemento di un dizionario.

Metodo: tipo di funzione chiamata con una sintassi particolare ed invocata su un oggetto.

Invocare: chiamare un metodo.

Suggerimento: deposito temporaneo di valori precalcolati per evitare elabo-razioni inutili.

Overflow: errore generato quando un risultato `e troppo grande per essere rappresentato da un determinato formato numerico.

File ed eccezioni

Quando un programma `e in esecuzione i suoi dati sono in memoria; nel momento in cui il programma termina o il computer viene spento tutti i dati in memoria vengono irrimediabilmente persi. Per conservare i dati devi quindi memorizzarli in un file, solitamente memorizzato su hard disk, floppy o CD-ROM.

Lavorando con un gran numero di file `e logico cercare di organizzarli: questo viene fatto inserendoli in cartelle (dette anche “folder” o “directory”). Ogni file all’interno di una cartella `e identificato da un nome unico.

Leggendo e scrivendo file i programmi possono scambiare informazioni e anche generare documenti stampabili usando il formato PDF o altri formati simili. Lavorare con i file `e molto simile a leggere un libro: per usarli li devi prima aprire e quando hai finito li chiudi. Mentre il libro `e aperto lo puoi leggere o puoi scrivere una nota sulle sue pagine, sapendo in ogni momento dove ti trovi al suo interno. La maggior parte delle volte leggerai il libro in ordine, ma nulla ti vieta di saltare a determinate pagine facendo uso dell’indice.

Questa metafora pu`o essere applicata ai file. Per aprire un file devi specificarne il nome e l’uso che intendi farne (lettura o scrittura).

L’apertura del file crea un oggetto file: nell’esempio che segue useremo la variabile f per riferirci all’oggetto file appena creato.

>>> f = open("test.dat","w") >>> print f

<open file ’test.dat’, mode ’w’ at fe820>

La funzione open prende due argomenti: il primo `e il nome del file ed il secondo il suo “modo”. Il modo "w" significa che stiamo aprendo il file in scrittura. Nel caso non dovesse esistere un file chiamato test.dat l’apertura in scrittura far`a in modo di crearlo vuoto. Nel caso dovesse gi`a esistere, la vecchia copia verr`a rimpiazzata da quella nuova e definitivamente persa.

Quando stampiamo l’oggetto file possiamo leggere il nome del file aperto, il modo e la posizione dell’oggetto in memoria.

106 File ed eccezioni

Per inserire dati nel file invochiamo il metodo write: >>> f.write("Adesso")

>>> f.write("chiudi il file")

La chiusura del file avvisa il sistema che abbiamo concluso la scrittura e rende il file disponibile alla lettura:

>>> f.close()

Solo dopo aver chiuso il file possiamo riaprirlo in lettura e leggerne il contenuto. Questa volta l’argomento di modo `e "r":

>>> f = open("test.dat","r")

Se cerchiamo di aprire un file che non esiste otteniamo un errore: >>> f = open("test.cat","r")

IOError: [Errno 2] No such file or directory: ’test.cat’

Il metodo read legge dati da un file. Senza argomenti legge l’intero contenuto del file:

>>> Testo = f.read() >>> print Testo Adessochiudi il file

Non c’`e spazio tra Adesso e chiudi perch´e non abbiamo scritto uno spazio tra le due stringhe al momento della scrittura.

read accetta anche un argomento che specifica quanti caratteri leggere: >>> f = open("test.dat","r")

>>> print f.read(5) Adess

Se non ci sono caratteri sufficienti nel file, read ritorna quelli effettivamente disponibili. Quando abbiamo raggiunto la fine del file read ritorna una stringa vuota:

>>> print f.read(1000006) ochiudi il file

>>> print f.read() >>>

La funzione che segue copia un file leggendo e scrivendo fino a 50 caratteri per volta. Il primo argomento `e il nome del file originale, il secondo quello della copia:

def CopiaFile(Originale, Copia): f1 = open(Originale, "r") f2 = open(Copia, "w") while 1:

if Testo == "": break f2.write(Testo) f1.close() f2.close() return

L’istruzione break `e nuova: la sua esecuzione interrompe immediatamente il loop saltando alla prima istruzione che lo segue (in questo caso f1.close()). Il ciclo while dell’esempio `e apparentemente infinito dato che la sua condizione ha valore 1 ed `e quindi sempre vera. L’unico modo per uscire da questo ciclo `e di eseguire un break che viene invocato quando Testo `e una stringa vuota e cio`e quando abbiamo raggiunto la fine del file in lettura.

11.1 File di testo

Un file di testo `e un file che contiene caratteri stampabili e spazi bianchi, organizzati in linee separate da caratteri di ritorno a capo. Python `e stato specificatamente progettato per elaborare file di testo e fornisce metodi molto efficaci per rendere facile questo compito.

Per dimostrarlo creeremo un file di testo composto da tre righe di testo separate da dei ritorno a capo:

>>> f = open("test.dat","w")

>>> f.write("linea uno\nlinea due\nlinea tre\n") >>> f.close()

Il metodo readline legge tutti i caratteri fino al prossimo ritorno a capo: >>> f = open("test.dat","r")

>>> print f.readline() linea uno

>>>

readlines ritorna tutte le righe rimanenti come lista di stringhe: >>> print f.readlines()

[’linea due\n’, ’linea tre\n’]

In questo caso il risultato `e in formato lista e ci`o significa che le stringhe appaiono racchiuse tra apici e i caratteri di ritorno a capo come sequenze di escape. Alla fine del file readline ritorna una stringa vuota e readlines una lista vuota:

>>> print f.readline() >>> print f.readlines() []

108 File ed eccezioni

Quello che segue `e un esempio di elaborazione di un file: FiltraFile fa una copia del file Originale omettendo tutte le righe che iniziano con #:

def FiltraFile(Originale, Nuovo): f1 = open(Originale, "r") f2 = open(Nuovo, "w") while 1: Linea = f1.readline() if Linea == "": break if Linea[0] == ’#’: continue f2.write(Linea) f1.close() f2.close() return

L’istruzione continue termina l’iterazione corrente e continua con il prossimo ciclo: il flusso di programma torna all’inizio del ciclo, controlla la condizione e procede di conseguenza.

Non appena Linea `e una stringa vuota il ciclo termina grazie al break. Se il pri-mo carattere di Linea `e un carattere cancelletto l’esecuzione continua tornando all’inizio del ciclo. Se entrambe le condizioni falliscono (non siamo in presenza della fine del file n´e il primo carattere `e un cancelletto) la riga viene copiata nel nuovo file.

Nel documento Pensare da informatico (pagine 122-127)

Documenti correlati