P.24 Usare i file di testo

Con Python, lavorare con i file di testo non è per nulla complicato. I file ci permettono di memorizzare informazioni e dati in modo sicuro e permanente.

Creiamo un file di testo con il nostro editor preferito (potete usare direttamente anche Thonny). Nel file scrivete un messaggio a piacere e poi salvatelo con il nome “testo.txt”. Ora create un nuovo listato in Python:

testo = open("testo.txt")
print(testo.read())
testo.close()

Esegeundolo dovreste vedere apparire, nella shell, il testo contenuto nel file. Nel mio caso leggo:

Hello World!

L’ultima istruzione del codice è una close() ed è importante per segnalare a Python e quindi al sistema operativo che il file non ci interessa più. L’utilizzo della close() è fondamentale nelle operazioni di scrittura del file perché i sistemi operativi mantengono il file in memoria e solitamente non lo trasferiscono immediatamente sul disco e potrebbero attendere del tempo prima di farlo. Se chiudessimo il nostro programma prima di chiamare close(), rischieremmo di perdere i dati.

La lettura del file è realizzata chiamando il metodo read(). Possiamo far leggere anche solo alcuni caratteri, indicando il numero desiderato come argomento:

testo = open("testo.txt")
print(testo.read(3))
testo.close()

Ottenendo (nel caso nel file ci sia scritto “Hello World!”):

Hel

La lettura del file è sequenziale. Immaginate che le informazioni siano scritte su un nastro di carta. Una volta svolto il nastro, per poterlo leggere di nuovo, dovrete riavvolgerlo con seek().

testo = open("testo.txt")
print(testo.read())
testo.seek(0)
print(testo.read())
testo.close()

Questo codice stampa due volte il contenuto del file. Per riavvolgere il file abbiamo usato seek() indicando la posizione 0, infatti per la lettura viene usato un indice che parte da 0 e arriva fino in fondo al file.

Possiamo ricavare il numero di caratteri contenuti in un file utilizzando tell(). Purtroppo tell() può essere chiamata solo dopo aver letto tutto il file.

testo = open("testo.txt")
testo.read()
n = testo.tell()
print(n)
testo.close()

Non è sempre consigliabile (o utile) leggere un file per intero. Spesso infatti preferiamo leggere una linea per volta utilizzando readline(). Modificate il file “testo.txt” aggiungendo alcune righe di testo e poi provate il seguente codice:

testo = open("testo.txt")
l1 = testo.readline()
print(“linea 1:”,l1)
l2 = testo.readline()
print(“linea 2:”, l2)
testo.close()

Avrete notato che tra le righe appare una linea vuota, questo perché la riga estratta dal file termina con un carattere di “a capo” (\n) ma anche la print() scrive aggiungendo un carattere di “a capo” e quindi andrete a capo due volte.

Per leggere tutto il contenuto di un file, una riga per volta, utilizzando un ciclo for, scriveremo:

testo = open("testo.txt")
i = 1
for ll in testo:
    print(i, ll, end="")
    i += 1

testo.close()

In questo esempio, per evitare il problema del “doppio a capo” abbiamo modificato la print() specificando (con end=””) di non aggiungere alla fine, il carattere di “a capo”.

Scrivere in un file

La scrittura di un file non è molto più complessa della lettura. Chiamando la funzione open() possiamo creare un file in scrittura. Se il file non esiste, sarà creato, altrimenti lo sovrascriveremo!

f = open("miofile.txt", 'w')
f.write("hello\n")
f.write("mele")
f.write(" ")
f.write("10kg\n")
f.close()

Dopo aver creato il file, aprite la cartella in cui avete salvato il vostro listato in Python e cercate il file “miofile.txt”. Verificate il suo contenuto.

Avrete notato che come per la lettura del file, abbiamo usato ancora il comando open() aggiungendo però il parametro ‘w’ (che sta per write). Se al posto della ‘w’ indichiamo una ‘a’ (append), aggiungeremo il testo al file, senza cancellarlo. Indicando una x creeremo un file vuoto. Provate ad eseguire il seguente codice più volte e poi aprite il file creato per analizzare il suo contenuto.

f = open("miofile.txt", 'a')
f.write("hello\n")
f.close()

Ricordatevi sempre di chiudere il file dopo averlo utilizzato!

Operazioni con i file

La gestione dei file avviene utilizzando la libreria esterna os. Con questa libreria possiamo accedere direttamente alle funzioni del sistema operativo e possiamo quindi cancellare un file con:

import os
os.remove("demofile.txt") 

Ecco un semplice (ed inutile!) programma che crea un file e lo cancella dopo due secondi:

import os, time
f = open("myfile.txt", "x")
f.close()
time.sleep(2)
os.remove("myfile.txt")

Una funzione importante e molto utile è quella per verificare l’esistenza di un file così da evitare sovrascritture o cancellazioni indesiderate.

import os

if os.path.exists("demofile.txt"):
    os.remove("demofile.txt")
else:
    print("The file does not exist")
    f = open("demofile.txt", "x")
    f.close()

Questo codice verifica se un certo file esiste e nel caso, lo rimuove. Se il file non è presente, lo crea.