2013-04-01 14 views
13

GoalRimuovere le righe duplicate da un file CSV utilizzando uno script python

Ho scaricato un file CSV da Hotmail, ma ha un sacco di duplicati in essa. Questi duplicati sono copie complete e non so perché il mio telefono li abbia creati.

Voglio eliminare i duplicati.

approccio

scrivere uno script python per rimuovere i duplicati.

Specifiche tecniche

 

Windows XP SP 3 
Python 2.7 
CSV file with 400 contacts 

risposta

35

UPDATE: 2016

Se siete felici di utilizzare la utile more_itertools libreria esterna:

from more_itertools import unique_everseen 
with open('1.csv','r') as f, open('2.csv','w') as out_file: 
    out_file.writelines(unique_everseen(f)) 

una versione più efficiente di @ IcyFlame di soluzione

with open('1.csv','r') as in_file, open('2.csv','w') as out_file: 
    seen = set() # set for fast O(1) amortized lookup 
    for line in in_file: 
     if line in seen: continue # skip duplicate 

     seen.add(line) 
     out_file.write(line) 

Per modificare lo stesso file sul posto si potrebbe usare questo

import fileinput 
seen = set() # set for fast O(1) amortized lookup 
for line in fileinput.FileInput('1.csv', inplace=1): 
    if line in seen: continue # skip duplicate 

    seen.add(line) 
    print line, # standard output is now redirected to the file 
+1

ringraziamento nel 2016 – Anekdotin

+0

@Eddwinn Sei il benvenuto – jamylak

5

È possibile utilizzare il seguente script:

precondizione:

  1. 1.csv è il file che si compone dei duplicati
  2. 2.csv è il file di output che sarà privo dei duplicati una volta eseguito questo script.

codice

 


inFile = open('1.csv','r') 

outFile = open('2.csv','w') 

listLines = [] 

for line in inFile: 

    if line in listLines: 
     continue 

    else: 
     outFile.write(line) 
     listLines.append(line) 

outFile.close() 

inFile.close() 

Algoritmo Spiegazione

Ecco, quello che sto facendo è:

  1. apertura di un file in modalità lettura. Questo è il file che ha i duplicati.
  2. Quindi in un ciclo che viene eseguito fino a quando il file è finito, controlliamo se la linea ha già incontrato.
  3. Se è stato rilevato che non lo scriviamo nel file di output.
  4. Se noi non scriverlo nel file di output e aggiungerlo alla lista di record che sono stati riscontrati già
1

Una versione più efficiente del @ di jamylak soluzione: (con uno in meno di istruzioni)

with open('1.csv','r') as in_file, open('2.csv','w') as out_file: 
    seen = set() # set for fast O(1) amortized lookup 
    for line in in_file: 
     if line not in seen: 
      seen.add(line) 
      out_file.write(line) 

Per modificare lo stesso file sul posto è possibile utilizzare questo

import fileinput 
seen = set() # set for fast O(1) amortized lookup 
for line in fileinput.FileInput('1.csv', inplace=1): 
    if line not in seen: 
     seen.add(line) 
     print line, # standard output is now redirected to the file 
5

è possibile ottenere deduplicaiton efficiente utilizzando Pandas:

import pandas as pd 
file_name = "my_file_with_dupes.csv" 
file_name_output = "my_file_without_dupes.csv" 

df = pd.read_csv(file_name, sep="\t or ,") 

# Notes: 
# - the `subset=None` means that every column is used 
# to determine if two rows are different; to change that specify 
# the columns as an array 
# - the `inplace=True` means that the data structure is changed and 
# the duplicate rows are gone 
df.drop_duplicates(subset=None, inplace=True) 

# Write the results to a different file 
df.to_csv(file_name_output) 
+0

ottengo 'UnicodeDecodeError: codec 'utf-8' non è in grado di decodificare byte 0x96 in posizione 28: non valida start byte' quando provo ad aprire il mio file – ykombinator

+1

@ykombinator puoi passare il parametro "encoding" alla funzione "read_csv" - vedi https://docs.python.org/3/library/codecs.html#standard-encodings –

Problemi correlati