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 tipo bytes anziché 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:

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.