2011-10-07 16 views
5

Ho un file CSV con più voci. Esempio csv:Python: rimozione di voci CSV duplicate

user, phone, email 
joe, 123, [email protected] 
mary, 456, [email protected] 
ed, 123, [email protected] 

Sto cercando di rimuovere i duplicati da una colonna specifica nel CSV comunque con il codice qui sotto Ricevo un "indice di lista fuori portata". Ho pensato confrontando row[1] con newrows[1] troverei tutti i duplicati e riscrivo solo le voci univoche in file2.csv. Questo però non funziona e non riesco a capire perché.

f1 = csv.reader(open('file1.csv', 'rb')) 
    newrows = [] 
    for row in f1: 
     if row[1] not in newrows[1]: 
      newrows.append(row) 
    writer = csv.writer(open("file2.csv", "wb")) 
    writer.writerows(newrows) 

mio risultato finale è quello di avere una lista che mantiene la sequenza del file (set non funzionerà ... giusto?), Che dovrebbe assomigliare a questo:

user, phone, email 
joe, 123, [email protected] 
mary, 456, [email protected] 
+0

penso che una base di dati sarebbe veramente utile qui. Python funziona con OOB con SQLite, lo sai? – NullUserException

+0

quando qualcosa non funziona, hai sempre bisogno di descrivere cosa è successo. È un errore? è niente? è la cosa sbagliata? –

+0

Ho fatto ... il mio codice attualmente produce un indice di lista fuori range. Questo non ha senso in quanto cerca la seconda "colonna" con la riga [1]. – serk

risposta

8

row[1] si riferisce a la seconda colonna nella riga corrente (telefono). Va tutto bene.

Tuttavia, è newrows.append(row) aggiungere l'intera riga all'elenco.

Quando si seleziona row[1] in newrows si sta controllando il numero di telefono individuale contro un elenco di righe complete. Ma non è quello che vuoi fare. È necessario verificare su un elenco o un gruppo di soli numeri di telefono. Per questo, probabilmente si desidera tenere traccia delle righe e di una serie di numeri di telefono osservati.

Qualcosa di simile:

f1 = csv.reader(open('file1.csv', 'rb')) 
writer = csv.writer(open("file2.csv", "wb")) 
phone_numbers = set() 
for row in f1: 
    if row[1] not in phone_numbers: 
     writer.writerow(row) 
     phone_numbers.add(row[1]) 
+0

Questo ha funzionato. Grazie! Pensavo che "set" non avrebbe funzionato perché non avrebbe corretto l'ordine dell'output. Funzionerebbe ancora se usassi la lista 'newrows' e avessi modificato' append (row) 'in' writerow'? – serk

+0

@serk, set funziona perché non mi interessa mai l'ordine. Controllo sempre e solo se ci sono cose in esso. Sì, aggiungendo alla lista funzionerà bene. –

+1

A proposito, se si rimuovono i numeri di telefono duplicati per dire un database di telemark, si ha il potenziale per perdere davvero il proprio elenco di chiamate in questo modo. E a volte i numeri di telefono che si trovano più avanti nel file del lettore saranno ** più recenti ** e numeri di telefono più precisi, quindi gli stessi numeri di telefono che hai incontrato in precedenza nel file del lettore, poiché sono stati scritti nel file eariler in tempo poi lo stesso numero di telefono più avanti nel file del lettore. – DevPlayer

Problemi correlati