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! 🎶
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! 💻🔧
@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.
@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... 🤬
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! ☕😤
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!
@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!
@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? 😉
@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!