1. Creare, Leggere e Scrivere File Testuali

In questa lezione parleremo di file e di come sia possibile leggere e scrivere da e su un file di testo salvato nel nostro computer.

Esistono due modalità di scrittura in Python: write e append. Utilizzando write, ogni volta che andiamo ad aggiungere del contenuto, tutto ciò che era precedentemente salvato all'interno del file andrà perso, mentre utilizzando append, che significa aggiungere, il contenuto aggiunto si sommerà a quanto già presente nel file.


Il metodo write()

Iniziamo partendo dalla prima modalità: write(). Assegniamo un stringa a una variabile chiamata contenuto:

contenuto = "Oggi è una bellissima giornata!"

Ciò che dobbiamo fare ora è specificare il file testuale su cui vogliamo scrivere, e per fare questo facciamo utilizziamo la funzione open() per far sapere a Python a che file ci stiamo riferendo, poi possiamo effettuare la scrittura vera e propria con write(), usando il nome della variabile associata ad open(), nel nostro caso file_uno:

file_uno = open("esempio_uno.txt", "w")
file_uno.write(contenuto)
file_uno.close()    # ricordate sempre di chiudere i file!

Andando a controllare nel nostro file esempio_uno.txt, ecco che troviamo la frase appena scritta, "Oggi è una bellissima giornata!"


La funzione open()

La funzione open() accetta come parametri il nome del file su cui vogliamo scrivere e la modalità di scrittura, in questo caso w da write. Il nome del file può essere preceduto dal suo percorso all'interno del sistema, ad esempio file_uno = open("C:\\esempio_uno.txt", "w")

Nella definizione del percorso utilizziamo due slash e non uno, in quanto come ricorderete dalle lezioni precedenti questo è il carattere escape, e quindi per essere interpretato correttamente ha bisogno di essere a sua volta giustificato.

Visto che noi abbiamo specificato solamente il nome, Python andrà a cercalo nella sua cartella di lavoro di default. Se il file non esiste, come in questo caso, open() lo creerà per noi.


Il metodo close()

Il metodo close() viene utilizzato per chiudere un file aperto con la funzione open():

file.close()

È sempre buona pratica chiudere un file dopo averlo utilizzato, poiché ciò garantisce che tutte le modifiche apportate al file vengano salvate correttamente e che il sistema operativo smetta di utilizzare le risorse assegnate all’operazione richiesta. Inoltre, se si lavora con molti file contemporaneamente, è possibile che si raggiunga il limite massimo, quindi la chiusura dei file diventa ancora più importante!

ATTENZIONE: invece di utilizzare il metodo close() è consigliato utilizzare l’istruzione with introdotta a partire da Python 2.5. L’utilizzo di with garantisce una gestione più sicura delle risorse perché evita errori comuni come la mancata chiusura di un file o di una connessione di rete che potrebbero causare perdita di dati o problemi di sicurezza. Parliamo di with in una lezione dedicata nella serie Moduli d'uso comune e Concetti Intermedi.


La modalità append

Utilizziamo ora la seconda modalità di scrittura, append, per aggiungere del testo a quello già presente.

Creiamo del nuovo materiale da aggiungere, definendo una nuova variabile e assegnando a questa una nuova stringa

nuova_stringa = "python è fantastico"

La procedura è la stessa rispetto a quella mostrata finora, l'unica cosa che cambia è il secondo parametro passato a open():

file_uno = open("esempio1.txt", "a")
file_uno.write(nuova_stringa)
file_uno.close()

Andando a ricontrollare nel nostro file di testo, ecco che ora troviamo la nostra nuova aggiunta:

"Oggi è una bellissima giornata!python è fantastico"

Come vedete Python non va a capo automaticamente, dovrete specificarlo voi mediante un carattere newline:

file_uno = open("esempio1.txt","a")
file_uno.write("\nNuova_riga")
file_uno.close()

Questo è tutto ciò che vi serve sapere per iniziare a scrivere sui file!


Il metodo read()

Passiamo ora alla terza e ultima parte di questa lezione, la lettura da file; ad open() verrà passato stavolta il parametro "r", da read:

var_lettura = open("esempio1.txt", "r").read()

print(var_lettura)

# output
"Oggi è una bellissima giornata!python è fantastico
Nuova_riga"


I metodi readline() e readlines()

Il metodo readlines()

Volendo, invece di leggere tutto il contenuto del file come un'unica stringa, potete ottenere una lettura per righe apportando una piccola modifica a quanto abbiamo scritto in precedenza:

var_lettura = open("esempio_uno.txt", "r").readlines()

Grazie a readlines(), ora in var_lettura è presente una lista composta dalle varie righe del file:

var_lettura

# output
["Oggi è una bellissima giornata!python è fantastico","\nNuova_riga"]

Il metodo readlines() legge tutte le righe del file in memoria in una volta sola, quindi se il file è molto grande, potrebbe essere necessario utilizzare una soluzione alternativa, ad esempio, leggere il file linea per linea utilizzando il metodo readline().

Il metodo readline()

Il metodo readline() viene utilizzato per leggere una singola riga da un file di testo: legge la riga corrente del file e poi passa alla successiva. Ecco un esempio di come utilizzarlo:

f = open("mio_file.txt", "r")
riga = f.readline()
while riga != "":
    print(riga)
    riga = f.readline()
f.close()

In questo esempio viene creato un ciclo while (che continua finché la variabile riga non è vuota) e al suo interno viene stampata la riga corrente del file e il metodo readline() viene utilizzato per leggere la riga successiva e assegnarla alla variabile riga.

Il metodo readline() legge una singola riga del file alla volta, quindi è possibile utilizzarlo per leggere file di grandi dimensioni in modo efficiente.


Come spostarsi in un'altra cartella col modulo os

Iniziamo importando il modulo della Standard Library dedicato al sistema operativo, il modulo os:

import os

Tra le tante funzionalità presenti in questo modulo potete verificare la cartella su cui Python sta lavorando mediante:

os.getcwd()

E cambiarla con:

os.chdir("/percorso/file")

Questo vi faciliterà in maniera considerevole il lavoro, specialmente se state lavorando con più di un file per volta!