
La funzione open() in Python
In questo tutorial, parliamo della funzione open() in Python, una di quelle nozioni fondamentali che ogni aspirante programmatore dovrebbe conoscere bene.
open(name, mode)
Questa funzione è la porta d'accesso ai file sul tuo disco fisso. Accetta principalmente due parametri:
- Il nome del file (name) che vuoi aprire. E' un parametro obbligatorio.
- La modalità di apertura (mode) in cui puoi specificare se vuoi leggere il file, scrivere sul file, aggiungere contenuti alla fine, e così via. E' un parametro facoltativo e si indica con una stringa: `'r'` per lettura, `'w'` per scrittura, `'a'` per aggiungere, `'r+'` per leggere e scrivere, ecc.
La funzione open() restituisce un oggetto del tipo "file-object", un iteratore tramite il quale puoi interagire con il file.
Questo significa che puoi iterare direttamente sul file object in un ciclo for, per esempio, per leggere il suo contenuto riga per riga, senza dover caricare l'intero file in memoria.
In generale, la funzione open() ti permette di leggere, scrivere o aggiungere dati a file esistenti.
La modalità di apertura del file è un parametro facoltativo. Se non li indichi, Python considera di default la modalità di lettura del file. In altre parole, ti permette di leggere il contenuto del file ma non puoi modificarlo.
Apertura di un file
Per aprire un file in lettura devi indicare la modalità 'r' (read) al secondo parametro della funzione open()
Ad esempio, supponi di avere un file di testo, `esempio.txt`, che contiene alcune righe di testo.
Ecco come potresti aprirlo e leggerlo:
file = open('esempio.txt', 'r')
contenuto = file.read()
print(contenuto)
file.close()
Dopo aver aperto il file, per leggere il suo contenuto puoi usare il metodo read().
Ricorda di chiudere il file con file.close() dopo averlo letto.
È come chiudere la scatola dopo averla aperta e guardato dentro. Se non la chiudi, la scatola resta aperta. Lo stesso accade ai file.
Fai attenzione a non riutilizzare l'etichetta del file object quando lo stai utilizzando. Il linguaggio Python chiude automaticamente il file object una volta che perde il suo identificatore o etichetta di riferimento, eseguendo operazioni come lo svuotamento del buffer e la liberazione dello spazio di memoria allocato. Ad esempio, questo script apre un file assegnandogli l'etichetta "myFile".
myFile = open('esempio.txt', 'w')
myFile = 10
Successivamente, lo script riassegna l'etichetta "myFile" al valore 10. In questo momento, Python interviene automaticamente per chiudere l'oggetto file precedentemente associato a myFile, poiché l'identificatore/etichetta originale non fa più riferimento a quel file object.
Scrittura su un file
Se vuoi scrivere qualcosa su un file, devi usare la modalità 'w' (write).
Fai attenzione, se il file esiste già, questa operazione cancella il suo contenuto precedente.
file = open('nuovo.txt', 'w')
file.write('Ciao mondo!')
file.close()
Per scrivere un nuovo contenuto nel file puoi utilizzare il metodo write().
Se il file 'nuovo.txt' non esiste, Python lo crea. Se, invece, già esiste, viene sovrascritto con il nuovo contenuto.
Ricorda che la funzione open() utilizza un buffering durante la scrittura. Questo vuol dire che quando il metodo write() scrive qualcosa nel file, il contenuto non viene scritto immediatamente all'interno del file ma tenuto in memoria. Per questa ragione, al termine del lavoro è importante svuotare il buffer per completare la scrittura nel file tramite il metodo flush() o chiudendo correttamente il file tramite il metodo close().
Aggiungere contenuto a un file
Per aggiungere contenuto senza cancellare i dati esistenti, puoi usare la modalità 'a' (append).
file = open('esempio.txt', 'a')
file.write('\nUn\'altra riga di testo.')
file.close()
Se il file esiste, il nuovo contenuto viene aggiunto in coda al file, senza cancellare il contenuto esistente.
In questo caso, se il file non esiste, Python lo crea e scrive il contenuto.
Uso di with
Python offre anche una sintassi più elegante per gestire i file che si occupa automaticamente della chiusura, utilizzando la struttura with.
È come dire a Python: "Apri questa scatola, e quando ho finito, chiudila tu".
with open('esempio.txt', 'r') as file:
contenuto = file.read()
print(contenuto)
In questo caso non devi più preoccuparti di chiudere il file con il metodo close(), Python lo fa per te non appena il blocco `with` è completato.
Ricorda però di indentare le istruzioni di gestione del file rispetto a with. In altre parole, devi scriverle con un rientro a destra.
I parametri della funzione open
La funzione open() ha diversi parametri che è utile conoscere.
Ecco una spiegazione dettagliata dei suoi parametri principali:
- file: Questo parametro specifica il percorso del file da aprire. Può essere una stringa che rappresenta il percorso completo o relativo al file. Può anche essere un oggetto che implementa l'interfaccia `os.PathLike`, il quale restituisce un percorso.
- mode: Questo parametro determina la modalità in cui il file viene aperto. Le modalità più comuni sono:
- 'r': apre il file in modalità di sola lettura (default).
- 'w`: apre il file in modalità di scrittura, sovrascrivendo il file se esiste o creandone uno nuovo se non esiste.
- 'x': apre il file in modalità esclusiva di scrittura. Se il file esiste, l'operazione fallisce.
- 'a': apre il file in modalità di append, scrivendo i dati alla fine del file se esiste o creandone uno nuovo se non esiste.
- 'b': apre il file in modalità binaria (binary mode). L'output è una stringa di byte. Puoi usarla in diverse modalità di apertura: 'rb', 'rw', 'xb', ecc.
- 't': apre il file in modalità di testo (default). Quindi, l'output e l'input sono una stringhe di testo.
- '+': apre il file per aggiornamento (lettura e scrittura). Può funzionare in diverse modalità: 'r+', 'w+', 'x+', 'a+'.
Ad esempio:f = open('myfile', 'w')
- buffering: Questo parametro specifica la dimensione del buffer da utilizzare per il flusso di file. Il valore `0` indica nessun buffering ma è valido solo valido in modalità binaria, `1` indica il buffering di linea, ovvero il buffer si svuota automaticamente dopo ogni nuova linea (valido solo in modalità testo), mentre valori maggiori specificano la dimensione del buffer in byte. Ad esempio:
f = open('myfile', 'w', buffering=1)
- encoding: Questo parametro specifica la codifica da utilizzare per leggere il contenuto del file. Se non viene indicata, Python utilizza la codifica usata dal sistema operativo. Ad esempio:
f = open('myfile', 'w', encoding='latin1')
- errors: Questo parametro può specificare come gestire gli errori di codifica e decodifica. Alcuni valori comuni includono - 'strict' lancia un'eccezione in caso di errore
- 'ignore' ignora gli errori
- 'replace' sostituisce i caratteri problematici con un marcatore di sostituzione
Ad esempio:f = open('myfile', 'w', errors='ignire')
- newline
Questo parametro controlla come le nuove linee vengono gestite. Quando è 'None' (comportamento predefinito, tutte le nuove linee vengono convertite a '\n', '' (nessuna conversione), '\n', '\r', e '\r\n'.Ad esempio:f = open('myfile', 'w', newline='\r')
- closefd: Se il file è aperto passando un file descriptor piuttosto che un nome di file, questo parametro deve essere `False`, il che indica che il file descriptor non verrà chiuso quando l'oggetto file verrà chiuso. Se questo parametro è `True` (comportamento predefinito), allora il file verrà chiuso quando l'oggetto file verrà chiuso.
- opener: Questo parametro permette di specificare un'opener custom, che è una funzione che accetta `(file, flags)` e restituisce un file descriptor aperto. Può essere utilizzato per modificare il comportamento dell'apertura del file, ad esempio, utilizzando un file descriptor aperto in un modo non standard.