💾 Perché gestire i file?
La gestione dei file in Python è un aspetto fondamentale della programmazione, permettendo di leggere, scrivere e modificare dati in modo persistente. I file vengono utilizzati per conservare informazioni tra le esecuzioni di un programma, evitando la perdita di dati.
⚙️ Configurazione
Salvataggio di dati di configurazione e preferenze utente
📊 Logging
Registrazione di eventi e attività del programma
📋 Dati Strutturati
Manipolazione di file CSV, JSON e XML
🔢 File Binari
Lettura e scrittura di immagini, audio e altri file binari
🔓
Apertura e Chiusura dei File
L’accesso ai file in Python avviene tramite la funzione open(), che richiede il percorso del file e una modalità di apertura.
⚠️ Metodo Tradizionale (Non Raccomandato):
Richiede la chiusura manuale del file con close()
file = open("esempio.txt", "r") # Apertura in lettura
contenuto = file.read()
file.close() # ⚠️ Chiusura manuale necessaria!
✅ Metodo Raccomandato: Context Manager
Utilizza with per gestire automaticamente l’apertura e la chiusura del file
with open("esempio.txt", "r") as file:
contenuto = file.read()
# Il file viene chiuso automaticamente all'uscita dal blocco! ✅
with?
- Chiusura automatica del file anche in caso di errori
- Codice più pulito e leggibile
- Gestione corretta delle risorse di sistema
🎛️
Modalità di Apertura
Python offre diverse modalità per aprire i file, ognuna con uno scopo specifico:
📌 Nota Importante:
La modalità w cancella completamente il contenuto esistente. Per aggiungere dati, usa a!
✍️
Lettura e Scrittura
Python fornisce diversi metodi per interagire con i file, ognuno ottimizzato per casi d’uso specifici:
📖 Metodi di Lettura
read()– legge tutto il contenuto del filereadline()– legge una singola riga alla voltareadlines()– restituisce una lista di tutte le righe
✍️ Metodi di Scrittura
write()– scrive una stringa nel filewritelines()– scrive una lista di stringhe
📝 Esempio: Scrittura in un File
with open("esempio.txt", "w") as file:
file.write("Questo è un nuovo testo\n")
file.write("Seconda riga di testo\n")
# File salvato e chiuso automaticamente! ✅
📖 Esempio: Lettura Riga per Riga
with open("esempio.txt", "r") as file:
for riga in file:
print(riga.strip()) # strip() rimuove spazi e \n
# Output:
# Questo è un nuovo testo
# Seconda riga di testo
💡 Best Practice:
Per file di grandi dimensioni, è preferibile leggere riga per riga piuttosto che caricare tutto in memoria con read(). Questo approccio è più efficiente e previene problemi di memoria.
🔄 Esempio: Lettura Completa del File
# Metodo 1: Tutto in una stringa
with open("esempio.txt", "r") as file:
contenuto = file.read()
print(contenuto)
# Metodo 2: Lista di righe
with open("esempio.txt", "r") as file:
righe = file.readlines()
for riga in righe:
print(riga.strip())
⚠️
Gestione degli Errori
Durante la manipolazione dei file possono verificarsi vari errori: file inesistenti, permessi insufficienti, disco pieno, ecc. È fondamentale gestirli correttamente con try-except.
🚨 Errori Comuni:
- FileNotFoundError: Il file specificato non esiste
- PermissionError: Permessi insufficienti per accedere al file
- IOError: Errore generico di input/output
- IsADirectoryError: Si sta tentando di aprire una cartella come file
try:
with open("esempio.txt", "r") as file:
contenuto = file.read()
print(contenuto)
except FileNotFoundError:
print("❌ Errore: Il file non esiste.")
except PermissionError:
print("❌ Errore: Permessi insufficienti per leggere il file.")
except IOError as e:
print(f"❌ Errore di lettura/scrittura: {e}")
else:
print("✅ File letto con successo!")
finally:
print("🔚 Operazione completata.")
💡 Struttura Completa:
- try: Codice che potrebbe generare errori
- except: Gestione degli errori specifici
- else: Eseguito solo se NON ci sono errori
- finally: Eseguito sempre, con o senza errori
🛡️ Esempio: Scrittura Sicura
def scrivi_file_sicuro(nome_file, contenuto):
try:
with open(nome_file, "w") as file:
file.write(contenuto)
return True, "✅ File scritto con successo"
except PermissionError:
return False, "❌ Permessi insufficienti"
except IOError as e:
return False, f"❌ Errore: {e}"
# Utilizzo
successo, messaggio = scrivi_file_sicuro("dati.txt", "Hello World!")
print(messaggio)
🚀
Gestione Avanzata dei File in Python
Dopo aver visto le operazioni di base, esploriamo tecniche avanzate per la manipolazione efficiente di file di testo e binari. Questi strumenti sono essenziali quando si lavora con grandi quantità di dati o formati specifici come CSV e JSON.
🖼️
Lettura e Scrittura di File Binari
Oltre ai file di testo, Python consente la gestione di file binari, essenziali per immagini, audio, video e altri dati non testuali.
- Immagini (JPG, PNG, GIF)
- Audio e video (MP3, MP4, AVI)
- File compressi (ZIP, RAR)
- Eseguibili e librerie
# Lettura di un file binario (es. immagine)
with open("immagine.jpg", "rb") as file:
dati = file.read()
# Scrittura su un nuovo file binario (copia)
with open("copia.jpg", "wb") as file:
file.write(dati)
print("✅ File copiato con successo!")
📌 Modalità Binarie:
rb = Read Binary (lettura binaria)
wb = Write Binary (scrittura binaria)
Queste modalità assicurano la corretta lettura e scrittura dei dati binari senza modifiche.
📊
Gestione dei File CSV
I file CSV (Comma-Separated Values) sono comunemente utilizzati per la gestione di dati tabulari. Python offre il modulo csv per lavorare facilmente con questi file.
📖 Lettura di un File CSV
import csv
with open("dati.csv", "r", newline="", encoding="utf-8") as file:
lettore = csv.reader(file)
for riga in lettore:
print(riga)
# Output esempio:
# ['Nome', 'Età', 'Città']
# ['Alice', '30', 'Roma']
# ['Bob', '25', 'Milano']
✍️ Scrittura su un File CSV
import csv
with open("output.csv", "w", newline="", encoding="utf-8") as file:
scrittore = csv.writer(file)
scrittore.writerow(["Nome", "Età", "Città"])
scrittore.writerow(["Alice", 30, "Roma"])
scrittore.writerow(["Bob", 25, "Milano"])
print("✅ File CSV creato con successo!")
📌 Parametri Importanti:
newline="" – Evita problemi con le righe vuote nei file CSV
encoding="utf-8" – Supporta caratteri speciali e accentati
💡 CSV con Dizionari:
Per CSV più complessi, usa csv.DictReader e csv.DictWriter per lavorare con dizionari invece di liste!
🗂️
Lavorare con File JSON
Il formato JSON (JavaScript Object Notation) è molto diffuso per la memorizzazione e lo scambio di dati tra applicazioni. Python offre il modulo json per gestire facilmente questi file.
- Formato leggibile e strutturato
- Standard per API e servizi web
- Supporta tipi di dati complessi (liste, dizionari, annidamenti)
📖 Lettura di un File JSON
import json
with open("dati.json", "r", encoding="utf-8") as file:
dati = json.load(file)
print(dati)
# Accesso ai dati
print(f"Nome: {dati['nome']}")
print(f"Età: {dati['età']}")
✍️ Scrittura su un File JSON
import json
dati = {
"nome": "Alice",
"età": 30,
"città": "Roma",
"hobby": ["lettura", "coding", "viaggi"]
}
with open("output.json", "w", encoding="utf-8") as file:
json.dump(dati, file, indent=4, ensure_ascii=False)
print("✅ File JSON creato con successo!")
📌 Parametri Utili:
indent=4 – Rende il JSON più leggibile con indentazione
ensure_ascii=False – Preserva i caratteri accentati
⚡
Manipolazione di File di Grandi Dimensioni
Quando si lavora con file molto grandi, è fondamentale leggere i dati in modo incrementale per ottimizzare l’uso della memoria ed evitare crash del programma.
⚠️ Problema:
Caricare un file da 1GB in memoria con read() può bloccare il sistema!
✅ Soluzione: Lettura Incrementale
def processa(linea):
# La tua logica di elaborazione
print(linea.strip())
with open("grande_file.txt", "r", encoding="utf-8") as file:
for linea in file:
processa(linea) # Elabora una riga alla volta
# Vantaggi:
# ✅ Usa poca memoria
# ✅ Funziona con file di qualsiasi dimensione
# ✅ Veloce ed efficiente
🔄 Lettura a Blocchi
# Leggi il file a blocchi di 1024 byte
with open("grande_file.bin", "rb") as file:
while True:
chunk = file.read(1024)
if not chunk:
break
# Elabora il blocco
process_chunk(chunk)
✍ Esercitazioni Guidate
🔹 Esercizio 1: Scrivi un File
Crea un file dati.txt e scrivi il tuo nome.
✅ Codice da completare:
with open("dati.txt", "w") as file:
file.write(____)
✅ Soluzione:
with open("dati.txt", "w") as file:
file.write("Mario Rossi")
# Oppure con input dell'utente:
nome = input("Inserisci il tuo nome: ")
with open("dati.txt", "w") as file:
file.write(nome)
print("✅ File creato con successo!")
🔹 Esercizio 2: Leggi il File
Leggi e stampa il contenuto di dati.txt.
✅ Codice da completare:
with open("dati.txt", "r") as file:
print(____)
✅ Soluzione:
with open("dati.txt", "r") as file:
print(file.read())
# Oppure con gestione errori:
try:
with open("dati.txt", "r") as file:
contenuto = file.read()
print(f"Contenuto del file: {contenuto}")
except FileNotFoundError:
print("❌ File non trovato!")
🔹 Sfida Extra:
Aggiungi nuove righe al file senza sovrascrivere i dati esistenti. Suggerimento: usa la modalità "a" (append)!
🎓 Conclusione
Questa panoramica copre le basi della gestione dei file in Python. Per tecniche avanzate come la gestione di file binari, CSV e JSON, continua il tuo percorso!
📊 File CSV
Impara a manipolare dati tabulari e fogli di calcolo
🗂️ File JSON
Gestisci dati strutturati in formato JSON
🖼️ File Binari
Lavora con immagini, audio e video
📂 Gestione Path
Manipola percorsi e cartelle con pathlib