File di testo in Python
In questa pagina 7
Un file sta in memoria di massa e sopravvive al programma (vedi Struttura di un elaboratoreModello di von Neumann: CPU, memoria centrale, bus e periferiche; ciclo fetch-decode-execute e gerarchia di memoria.Struttura di un elaboratore →). Un file di testo è una sequenza di byte da interpretare con una codifica (UTF-8, vedi Rappresentazione binaria dei datiBasi 2, 8 e 16; interi senza segno e in complemento a 2 con overflow; virgola mobile IEEE 754 e sue approssimazioni; caratteri ASCII, Unicode e UTF-8.Rappresentazione binaria dei dati →) e divisa in righe dal carattere \n.
Apertura
f = open("dati.txt", "r", encoding="utf-8")
...
f.close()| Modalità | Significato |
|---|---|
"r" |
lettura (default); FileNotFoundError se il file non esiste |
"w" |
scrittura; crea o svuota il file |
"a" |
aggiunta in fondo; crea il file se non esiste |
"x" |
creazione; errore se il file esiste già |
"b" aggiunto ("rb", "wb") |
modalità binaria: si leggono bytes, non str |
Indicare sempre encoding="utf-8": su Windows la codifica predefinita può essere diversa e le lettere accentate si corrompono.
with
with open("dati.txt", encoding="utf-8") as f:
for riga in f:
...
# qui il file è già chiuso, anche se nel blocco è stata sollevata un'eccezionewith chiude il file automaticamente: è la forma da usare sempre.
Lettura
with open("dati.txt", encoding="utf-8") as f:
for riga in f: # riga per riga, include il "\n" finale
riga = riga.rstrip("\n")
if not riga:
continue # salta le righe vuote
campi = riga.split(";")| Metodo | Restituisce |
|---|---|
f.read() |
tutto il contenuto in una stringa |
f.readline() |
la riga successiva (con \n); "" a fine file |
f.readlines() |
lista di tutte le righe |
iterazione for riga in f |
una riga alla volta, senza caricare tutto in memoria |
Esempio: media dei numeri di un file, uno per riga.
def media_file(nome):
tot, n = 0.0, 0
with open(nome, encoding="utf-8") as f:
for riga in f:
riga = riga.strip()
if riga:
tot += float(riga)
n += 1
return tot / n if n > 0 else NoneScrittura
with open("out.txt", "w", encoding="utf-8") as f:
f.write("prima riga\n") # write non aggiunge "\n" e accetta solo str
f.write(str(42) + "\n")
print("con print", 3.5, file=f) # print aggiunge spazi e "\n" e converte da soloPercorsi
- Un percorso relativo (
"dati.txt","dati/voti.txt") è relativo alla cartella di lavoro corrente (quella da cui si lanciapython), non alla cartella dello script. - Su Windows si possono usare le barre
/anche nei percorsi Python; con\serve una raw string (r"C:\dati\voti.txt"). pathlib.Patheos.path.exists(nome)per comporre e verificare percorsi.
File CSV
Valori separati da virgole (o punto e virgola). Il modulo csv gestisce le virgolette e i separatori dentro i campi:
import csv
with open("voti.csv", newline="", encoding="utf-8") as f:
for nome, voto in csv.reader(f):
print(nome, int(voto))
with open("out.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["nome", "voto"])
w.writerows([("Ada", 30), ("Alan", 28)])Errori tipici
- Aprire in
"w"un file che si voleva estendere: il contenuto viene cancellato. - Dimenticare di togliere
\ndalle righe lette (confronti che falliscono,int("5\n")funziona ma"5\n" == "5"no). - Leggere due volte lo stesso file aperto: alla seconda il cursore è già in fondo e non si legge niente.
- Gestire
FileNotFoundErrorcon un messaggio chiaro: Eccezioni in PythonEccezioni e traceback, eccezioni predefinite più comuni, try/except/else/finally, raise per segnalare errori, propagazione lungo le chiamate.Eccezioni in Python →.