Perché il mio codice Python dà 'IndentationError' anche se l'indentazione sembra corretta?

👤 Iniziato da @audacegallo
📅 03/09/2025 22:00
📁 Programmazione 🌐 IT
Avatar di audacegallo
Ciao a tutti, sono alle prese con un errore di indentazione in Python che proprio non riesco a capire. Ho un semplice script che dovrebbe leggere un file CSV e fare qualche operazione, ma continua a darmi questo errore:

```python
File "script.py", line 15
for row in reader:
^
IndentationError: unexpected indent
```

Il punto è che l'indentazione mi sembra perfetta! Ho controllato mille volte, ho persino usato un editor diverso per essere sicuro di non avere problemi con tab/spazi. Uso Python 3.9 su Windows 10, e il codice è questo:

```python
import csv

with open('dati.csv', 'r') as file:
reader = csv.reader(file)
for row in reader: # questa è la riga 15
print(row)
```

Ho già provato a cancellare e riscrivere tutto, a convertire i tab in spazi (e viceversa), ma niente. Qualcuno ha idea di dove possa essere il problema? Magari è una cosa stupida che non vedo perché ho troppa sonnolenza (come al solito, ho rimandato questo progetto all'ultimo). Grazie in anticipo per qualsiasi suggerimento!
Avatar di desdemonadesantis
Guarda che l'errore è lampante: hai un'indentazione sbagliata dopo la riga `reader = csv.reader(file)`. In Python l'indentazione deve essere coerente all'interno dello stesso blocco. Tu hai messo un rientro in più prima del `for`, ma la riga precedente non è indentata.

Prova così:

```python
import csv

with open('dati.csv', 'r') as file:
reader = csv.reader(file)
for row in reader: # ora è allineato correttamente
print(row)
```

Se continui a vedere l'errore, controlla che non ci siano spazi o tab nascosti. A volte gli editor mostrano l'indentazione in modo fuorviante. Usa un editor che visualizzi i caratteri non stampabili (come VS Code con l'opzione "Render Whitespace") per essere sicura.

E smettila di rimandare i progetti all'ultimo, che poi ti ritrovi a combattere con errori stupidi alle 3 di notte! 😤
Avatar di michelemarino
Ciao, @audacegallo, mi sa che Desdemona ha centrato il problema con quell'indentazione extra – succede, ma è una di quelle cose che ti fanno imprecare per ore! Io, che passo il tempo a calibrare ingredienti in cucina per ricette perfette, so quanto possa essere frustrante un dettaglio fuori posto. Prova non solo a controllare gli spazi nascosti, ma anche a usare un tool come Black o autopep8 per formattare automaticamente il codice; ti evita questi grattacapi in futuro. E sì, rimandare i progetti all'ultimo è una pessima idea, fidati, ho perso nottate simili. Correggi come suggerito e facci sapere se funziona, magari poi parliamo di una ricetta per rilassarti! 😅
Avatar di fabriziapalmieri
L'errore è nella struttura del codice: il ciclo `for` è indentato di un livello in più rispetto al resto del blocco `with`. Osserva bene, la riga `reader = csv.reader(file)` è a 4 spazi, mentre il `for` è a 8. Python richiede che tutti i comandi nello stesso blocco logico abbiano esattamente la stessa indentazione. In questo caso, il `for` deve stare allineato alla riga precedente (4 spazi totali sotto `with`), non a 8. Questo è un classico "dettaglio invisibile" che sfugge dopo ore di lavoro. Ti consiglio di attivare la visualizzazione dei caratteri invisibili nell'editor oppure usa il comando `python -m py_compile script.py` per evidenziare subito gli errori di indentazione. E per favore, la prossima volta non aspettare l'ultima notte per il debug: l'ansia da tab/spazi ti brucia la testa e i progetti meritano più rispetto! 🤯
Avatar di barbarigogatti
Ah, l'errore più classico del mondo Pythonista! @audacegallo, guarda che il problema è proprio lì: il 'for' è indentato a 8 spazi invece che a 4, sotto il 'with'. Python non scherza con l'indentazione: se la riga sopra (reader = ...) è a 4, anche il ciclo deve stare allo stesso livello. Ti è sfuggito un rientro in più, magari per colpa di un tab nascosto. Apri il file con Notepad++ e attiva 'Visualizza spazi' (View > Show Symbol > Show White Space and TAB) – vedrai subito quei maledetti caratteri invisibili. Io, l'altro ieri, ho perso mezz'ora per un tab incastrato in un commento... Smettila di usare editor che non mostrano gli spazi, è una guerra persa. E sì, rimandare aiuta un corno: l'ansia ti fa vedere errori che non esistono!
Avatar di audacegallo
Ahhh, @barbarigogatti, hai beccato il problema! Ero convinto che l'indentazione fosse giusta, ma effettivamente avevo un tab di troppo che mi fregava. Ho aperto con Notepad++ come hai detto e... santo cielo, quel maledetto carattere invisibile era lì a tormentarmi. Grazie mille per l'aiuto! La prossima volta non rimando fino all'ultimo e controllo meglio gli spazi. Anche se, sai com'è, probabilmente lo farò lo stesso e mi ritroverò di nuovo nella stessa situazione...
Avatar di galepiras
Cavolo @audacegallo, che incubo questi errori di indentazione! Proprio ieri mi è capitata una situazione simile con un tab fantasma che mi ha fatto impazzire per un'ora. Sulla tua dichiarazione di "non rimandare più", scommetto una pizza che tra due settimane sarai di nuovo alle 2 di notte a combattere con gli spazi invisibili - siamo tutti così, non fartene una colpa!

Per prevenire sto delirio in futuro, ti consiglio due mosse infallibili:
1) Configura il tuo editor per SOSTITUIRE SEMPRE i tab con 4 spazi (in VSCode cerca "editor.insertSpaces": true nei settings)
2) Installa un linter tipo Pylint che ti strilla subito quando l'indentazione è incoerente.

Ah, e se usi Windows, occhio che il Blocco Note è un campo minato per Python - meglio editor con highlight degli spazi come Sublime o Notepad++. La prossima volta che procrastini, almeno fallo con gli strumenti giusti!
Avatar di alessiacosta
Ah @galepiras, hai centrato il problema con la precisione di un linter! Anch'io ho un rapporto d'amore-odio con gli spazi invisibili, sembrano moltiplicarsi ogni volta che guardo le serie TV fino a tardi. La tua combo VSCode + Pylint è oro colato, ma aggiungerei un terzo step da procrastinatrice seriale: **Black**.

Quel formatter automatico è come Netflix per il codice: premi Ctrl+S e ti sistema l'indentazione mentre sei già immerso nella scena successiva. E ti capisco sul Blocco Note: usarlo per Python equivale a cucinare una carbonara con un accendino.

Quanto alla scommessa sulla pizza... hai assolutamente ragione. Tra due settimane saremo tutti qui alle 2:23 AM a maledire quel tab che sembra un space, ma almeno con gli strumenti giusti ci metteremo 5 minuti invece di un'ora. #SquadraProcrastinatoriOrganizzati 😉
Avatar di baileymancini42
Alessia, Black è un MUST, ma ti capisco se all’inizio ti sembra un po’ troppo rigido—io ho mollato dopo aver visto il mio codice trasformato in qualcosa di *troppo* pulito mentre imprecavo su un progetto di Django. Poi ho capito che quel "troppo pulito" era esattamente ciò che mi salvava dalle ore di debug notturne (tipo quella volta che ho passato mezzanotte a cercare un tab nascosto mentre *The Bear* mi distruggeva l’anima). Ora lo faccio partire con un hook di pre-commit e non torno indietro. Però attenta: se il team non è allineato, diventa una guerra fredda peggiore del tab vs space. Per la pizza di @galepiras? Ci sarò, ma stavolta con Black acceso e il caffè già freddo. PS: quel tab fantasma è come il malefico di *Severance*: prima o poi spunta, ma almeno ora lo vedo arrivare. 😉
Avatar di vandagiordano30
Ah Bailey, *troppo pulito* è come dire *troppo cioccolato*: non esiste! 😂 Però capisco il trauma da formattazione forzata, è tipo quando ti tagliano i capelli e all’inizio ti sembri un pappagallo spennacchiato. Poi realizzi che Django + Black è come avere un parrucchiere personale che ti evita i nodi matti nel codice (e le crisi esistenziali alle 3 AM).

Sul team non allineato: santo cielo, hai ragione. È peggio della resa dei conti tra chi mette l’ananas sulla pizza e chi sogna di bandirli dall’umanità. Ma se li convinci con la minaccia di un PR con 237 file modificati da Black, cedono tutti.

PS: L’hook di pre-commit è la mia religione, ma il caffè freddo è eresia. Per la pizza porto il termos. E se compare il tab-malefico, lo esorcizzo con un bel `black --skip-string-normalization` (perché sì, sono quella stronza che difende le doppie virgolette). 🍕🔥

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!