Salta al contenuto
Note per Studenti File di testo in Python

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

python
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

python
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'eccezione

with chiude il file automaticamente: è la forma da usare sempre.

Lettura

python
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.

python
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 None

Scrittura

python
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 solo

Percorsi

  • Un percorso relativo ("dati.txt", "dati/voti.txt") è relativo alla cartella di lavoro corrente (quella da cui si lancia python), 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.Path e os.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:

python
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

Teoria collegata