2.27. Lettura e scrittura¶
I file risiedono su disco; Python vi accede tramite open(), che restituisce un oggetto file i cui metodi leggono e scrivono i byte sottostanti.
2.27.1. open e le modalità¶
Il primo argomento è il percorso; il secondo è la modalità – una breve stringa che indica a Python come verrà usato il file:
"r"– lettura (predefinita). Apre un file esistente in lettura."w"– scrittura. Crea un nuovo file oppure tronca a vuoto uno esistente."a"– aggiunta (append). Apre un file in scrittura alla sua fine senza troncarlo."b"aggiunto a una qualsiasi delle precedenti ("rb","wb","ab") – modalità binaria. Il contenuto del file è di tipobytesanzichéstr.
f = open("notes.txt", "r")
text = f.read()
f.close()
2.27.2. Usa un context manager¶
Lo schema sopra perde l’handle del file se qualcosa tra open() e close solleva un’eccezione. La soluzione è l’istruzione with (vedi context manager):
with open("notes.txt") as f:
text = f.read()
# f is closed here, even if read() failed
Questa è la forma standard – scrivilo così ogni volta.
2.27.3. Lettura¶
Gli oggetti file supportano diversi stili di lettura:
io.IOBase.read()– legge l’intero file (o N byte) e lo restituisce come una singola stringa (o oggetto bytes).io.IOBase.readline()– legge una riga, incluso il"\n"finale.Iterare direttamente il file produce le righe una alla volta, con un consumo di memoria molto minore rispetto a leggere l’intero file in una volta.
with open("log.txt") as f:
for line in f:
print(line.rstrip())
str.rstrip() rimuove il carattere di a capo finale prima di stampare, così l’output non risulta a doppia interlinea.
2.27.4. Scrittura¶
Apri il file in modalità "w" e usa io.IOBase.write():
with open("out.txt", "w") as f:
f.write("hello\n")
f.write("world\n")
io.IOBase.write() non aggiunge un carattere di a capo – scrive esattamente i byte (o i caratteri, in modalità testo) che gli fornisci.
2.27.5. Testo vs binario¶
La modalità testo (predefinita, "r" / "w" senza "b") decodifica i byte in ingresso in str usando una codifica predefinita, e codifica le str in uscita riconvertendole in byte. Usala per configurazioni, log, JSON – qualsiasi cosa che sia testo.
La modalità binaria ("rb" / "wb") salta il passaggio di decodifica e restituisce bytes. Usala per immagini, record impacchettati con struct, catture di rete – qualsiasi cosa in cui ogni byte conti e il file non sia leggibile dall’uomo.
2.27.6. Elencare e rimuovere file¶
Il modulo os espone le operazioni sul filesystem che non sono presenti sull’oggetto file stesso:
os.listdir()– restituisce un elenco di nomi in una directory.os.remove()– elimina un file.os.rename()– rinomina un file.os.stat()– metadati del file (dimensione, data di modifica, …).os.mkdir()– crea una nuova directory.
import os
for name in os.listdir("/"):
print(name)
Intercetta OSError attorno a queste operazioni quando il file o la directory potrebbe non esistere – l’operazione è uno dei luoghi comuni in cui compaiono eccezioni negli script reali.