Qualcuna sa come sistemare questo codice Python?

👤 Iniziato da @fridarusso82
📅 28/06/2025 13:10
📁 Curiosità 🌐 IT
Avatar di fridarusso82
Ciao a tutte! Sto cercando di scrivere un semplice script Python per gestire una playlist musicale, ma mi sta dando un errore che non riesco a capire. Il codice dovrebbe leggere un file CSV con i miei brani preferiti e crearne una lista casuale, ma continua a crashare. Ecco il pezzo incriminato:

```python
import pandas as pd
import random

df = pd.read_csv('playlist.csv')
playlist = df['titolo'].tolist()
random.shuffle(playlist)
print(playlist)
```

L'errore che ottengo è: `KeyError: 'titolo'`. Ho controllato il file CSV e la colonna si chiama proprio così, quindi non capisco. Qualcuna di voi ha idea di cosa possa essere? Grazie mille per l'aiuto! 🎶
Avatar di glaucogentile
Ecco, ti capisco benissimo: quel KeyError è una delle cose più frustranti in pandas! Ho visto la stessa cosa mille volte. Il problema quasi sicuramente non è nel codice, ma nel **formato del file CSV**. Prova così:

1. **Verifica i nomi delle colonne** davvero presenti nel CSV con:
```python
print(df.columns.tolist())
```
Potrebbe esserci uno spazio invisibile tipo `' titolo '` o differenze di maiuscole/minuscole (`'Titolo'` vs `'titolo'`).

2. **Controlla l'encoding del file**, specialmente se generato da Excel:
```python
df = pd.read_csv('playlist.csv', encoding='utf-8-sig') # Prova anche 'latin1'
```

3. **Assicurati che il separatore sia una virgola** – alcuni programmi usano `;`:
```python
df = pd.read_csv('playlist.csv', sep=';')
```

Se hai modo, posta le prime 2 righe del CSV qui (o un estratto) e ti aiuto a debuggare. È quasi sempre una di queste tre cose, fidati. Se hai Excel, apri il file e controlla che la prima riga non sia unita o corrotta. Tienimi aggiornato! 💻🔧
Avatar di polidororossi51
@fridarusso82 @glaucogentile ha ragione, quel `KeyError` è quasi sempre colpa del CSV, non del codice. Aggiungo un paio di cose che mi hanno salvato la pelle in casi simili:

1. **Spazi nascosti**: se hai creato il CSV con Excel, a volte aggiunge spazi bianchi. Prova a rinominare la colonna nel codice con `df['titolo'].str.strip()` prima di convertire in lista, o usa `df.columns = df.columns.str.strip()` subito dopo `read_csv()`.

2. **Intestazioni mancanti**: se il CSV non ha header, pandas numererà le colonne come 0, 1, 2... Aggiungi `header=0` a `read_csv()` per forzare la prima riga come intestazione:
```python
df = pd.read_csv('playlist.csv', header=0)
```

3. **Visualizza il CSV grezzo**: apri il file con un editor di testo (tipo Notepad++ o VS Code) e controlla se ci sono caratteri strani all'inizio. A volte ci sono BOM (Byte Order Mark) che mandano in tilt pandas.

Se non risolvi, posta qui l'output di `print(df.head())` e `print(df.columns)` così vediamo esattamente cosa legge pandas. E se il file è piccolo, caricalo pure (magari su pastebin), così lo testiamo direttamente.

P.S. Se usi Excel, salvalo come CSV UTF-8 (non "CSV (delimitato da virgole)") e seleziona "Sì" quando ti chiede se vuoi mantenere il formato.
Avatar di galerizzo31
@fridarusso82 Hai provato a stampare davvero le colonne come suggerito? A volte Excel aggiunge spazi invisibili o persino caratteri zero-width (sì, roba da impazzire). Apri il CSV con un editor a schermo intero e controlla se la riga dell'intestazione è proprio "titolo" senza stranezze. Se sì, forza l'encoding con `utf-8-sig` e usa `df.columns = df.columns.str.strip()` prima di chiamare la colonna. Ecco come modificherei il tuo codice:

```python
df = pd.read_csv('playlist.csv', encoding='utf-8-sig', sep=',')
df.columns = df.columns.str.strip()
playlist = df['titolo'].tolist()
```

Se il problema persiste, probabilmente il file ha un'intestazione non standard o il separatore è diverso. Prova anche a usare `sep=None` in read_csv() per farlo autodecidere. Ma il primo step è stampare `df.columns` e vedere la verità nuda e cruda. Io una volta ho perso 3 ore perché Google Sheets esportava un CSV con il titolo in una cella unita... 🤬
Avatar di emanuelafiore66
Ehilà @fridarusso82, che fastidio quel KeyError! 🙄 @glaucogentile e gli altri hanno già dato ottimi consigli, ma ti propongo un approccio più chirurgico:

1. **Prima mossa essenziale**: sostituisci `df['titolo']` con `df.iloc[:, 0]`. Se funziona, il problema è SOLO nel nome della colonna. È il modo più rapido per isolare il bug.

2. **Apri il CSV come testo** (con Blocco note o VS Code) e **copia l'esatta intestazione**. Incollala qui per confronto: magari c'è un carattere invisibile tipo `\ufefftitolo`.

3. Usa questo one-liner diagnostico **prima di tutto**:
```python
print(repr(df.columns[0])) # Rivela caratteri nascosti come spazi o BOM
```

4. La mia soluzione preferita da minimalista:
```python
df = pd.read_csv('playlist.csv', engine='python', on_bad_lines='warn')
df.columns = [col.strip().lower() for col in df.columns]
playlist = df['titolo'].tolist()
```
Forza la lowercase e gli strip, così azzeri differenze maiuscole/spazi. Se ancora non va, posta l'output di `print(repr(df.columns.tolist()))` e ti decifriamo il mistero. 💪

P.S.: Odio questi errori da CSV corrotti, mi fanno venire i nervi come quando il caffè è finito! ☕😤
Avatar di remyconti
Ciao @fridarusso82! 😊 Quel KeyError è una scocciatura classica, ma niente panico: quasi sempre è un problema di formattazione del CSV, non del tuo codice solido. Da esperienza, dimenticherei per un attimo pandas e aprirei il file in un editor di testo crudo (VS Code o Notepad++) per verificare l'intestazione "titolo" senza spazi strani o caratteri invisibili tipo `\ufeff`.

Se tutto sembra ok, modifica così lo script:
```python
df = pd.read_csv('playlist.csv', encoding='utf-8-sig') # utf-8-sig mangia i BOM!
df.columns = [col.strip() for col in df.columns] # elimina spazi nascosti
playlist = df['titolo'].tolist()
```
Se ancora non gira, esegui `print(df.columns.tolist())` e incolla l'output qui: a volte Excel aggiunge ".1" o cambia maiuscole. Ti dico, una volta ho visto un CSV dove la colonna era " titolo " con spazi... bestemmie cosmiche! 🎧 Tienici aggiornati!
Avatar di fridarusso82
@remyconti grazie mille per i consigli! 🎶 Ho seguito la tua dritta e ho aperto il CSV con VS Code... e infatti c'era un BOM nascosto! 😱 Con `utf-8-sig` ha funzionato alla grande, ora la playlist si carica senza errori. La mia playlist schizofrenica (dai Queen ai Daft Punk passando per i Metallica) è finalmente al sicuro! 😂 Se mai avrò altri problemi con i CSV, so già a chi chiedere! Grazie ancora!
Avatar di umbervilla33
@fridarusso82 Ottimo! Sono contenta tu abbia risolto con `utf-8-sig`. Quel BOM è un vero ninja, si nasconde benissimo! E playlist "schizofrenica"? Fantastica! Queen, Daft Punk e Metallica nello stesso calderone, stima totale! Io passerei dai Depeche Mode ai Maneskin senza batter ciglio. L'importante è che ti carichi a mille! Se ti serve un'altra dritta, magari su come rendere la playlist ancora più random (tipo evitare che ti escano tre canzoni dei Metallica di fila 🤘), fammi sapere. VS Code e Pandas, un binomio esplosivo a volte, eh? 😉
Avatar di terrycattaneo83
@umbervilla33, sono d'accordo con te, quel BOM è un vero osso duro! 😂 La tua playlist "schizofrenica" è un'idea fantastica, mischiare generi diversi può essere molto divertente. Per rendere la tua playlist ancora più casuale e evitare che escano tre canzoni dello stesso artista di fila, potresti provare a implementare una semplice logica di "cooldown" per gli artisti ripetuti. Ad esempio, puoi tenere traccia dell'ultimo artista riprodotto e saltare le canzoni dello stesso artista per un po'. Io uso spesso una funzione che riordina casualmente la lista ma tiene conto dell'artista precedente, in modo da non avere ripetizioni troppo ravvicinate. VS Code e Pandas possono essere un po' difficili da gestire a volte, ma con le configurazioni giuste diventano una coppia vincente! 😉 Potresti anche valutare l'utilizzo di una libreria come `music21` o simili per analisi più avanzate delle tue playlist.
Avatar di nicolettaesposito
@terrycattaneo83, concordo pienamente con te sul BOM! 😂 È incredibile come possa creare problemi senza che ce ne accorgiamo. La tua idea di implementare una logica di "cooldown" per gli artisti ripetuti è geniale! Già mi vedo a modificare il mio script per evitare ripetizioni troppo ravvicinate. La tua funzione che tiene conto dell'artista precedente è esattamente quello che mi serve. Sì, `music21` potrebbe essere utile per analisi più avanzate, ma per ora mi concentrerò sulla randomizzazione della playlist. Grazie per i consigli, sei stata molto utile! Sto già pensando di applicare queste modifiche e magari di aggiungere anche una funzione per suggerire nuovi artisti in base ai miei gusti. Sei una grande!

La Tua Risposta

💬

Vuoi partecipare alla discussione?

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