¿Cómo puedo eliminar las líneas duplicadas de un archivo?

Tengo un archivo con una columna. ¿Cómo borrar líneas repetidas en un archivo?

Related of "¿Cómo puedo eliminar las líneas duplicadas de un archivo?"

En Unix / Linux, use el comando uniq , según la respuesta de David Locke, u sort , según el comentario de William Pursell.

Si necesitas un script en Python:

 lines_seen = set() # holds lines already seen outfile = open(outfilename, "w") for line in open(infilename, "r"): if line not in lines_seen: # not a duplicate outfile.write(line) lines_seen.add(line) outfile.close() 

Actualización: La combinación sort / uniq eliminará los duplicados, pero devolverá un archivo con las líneas ordenadas, lo que puede o no ser lo que desea. La secuencia de comandos de Python anterior no reordena las líneas, sino que simplemente elimina los duplicados. Por supuesto, para hacer que el script de arriba también se outfile.write(line) , simplemente outfile.write(line) y en su lugar, inmediatamente después del bucle, haga outfile.writelines(sorted(lines_seen)) .

Si estás en * nix, intenta ejecutar el siguiente comando:

 sort  | uniq 
 uniqlines = set(open('/tmp/foo').readlines()) 

Esto te dará la lista de líneas únicas.

Escribir eso de nuevo en algún archivo sería tan fácil como:

 bar = open('/tmp/bar', 'w').writelines(set(uniqlines)) bar.close() 

Es una repetición de lo que ya se ha dicho aquí, aquí lo que uso.

 import optparse def removeDups(inputfile, outputfile): lines=open(inputfile, 'r').readlines() lines_set = set(lines) out=open(outputfile, 'w') for line in lines_set: out.write(line) def main(): parser = optparse.OptionParser('usage %prog ' +\ '-i  -o ') parser.add_option('-i', dest='inputfile', type='string', help='specify your input file') parser.add_option('-o', dest='outputfile', type='string', help='specify your output file') (options, args) = parser.parse_args() inputfile = options.inputfile outputfile = options.outputfile if (inputfile == None) or (outputfile == None): print parser.usage exit(1) else: removeDups(inputfile, outputfile) if __name__ == '__main__': main() 

Obtenga todas sus líneas en la lista y haga un conjunto de líneas y listo. por ejemplo,

 >>> x = ["line1","line2","line3","line2","line1"] >>> list(set(x)) ['line3', 'line2', 'line1'] >>> 

y vuelve a escribir el contenido en el archivo.

Forros de Python One:

 python -c "import sys; lines = sys.stdin.readlines(); print ''.join(sorted(set(lines)))" < InputFile > OutputFile 

Tu puedes hacer:

 import os os.system("awk '!x[$0]++' /path/to/file > /path/to/rem-dups") 

Aquí estás usando bash en python 🙂

También tienes otra manera:

 with open('/tmp/result.txt') as result: uniqlines = set(result.readlines()) with open('/tmp/rmdup.txt', 'w') as rmdup: rmdup.writelines(set(uniqlines)) 

agregando a la respuesta de @David Locke, con los sistemas * nix que puede ejecutar

 sort -u messy_file.txt > clean_file.txt 

que creará clean_file.txt eliminando duplicados en orden alfabético.

Mira el script que creé para eliminar correos electrónicos duplicados de archivos de texto. ¡Espero que esto ayude!

 # function to remove duplicate emails def remove_duplicate(): # opens emails.txt in r mode as one long string and assigns to var emails = open('emails.txt', 'r').read() # .split() removes excess whitespaces from str, return str as list emails = emails.split() # empty list to store non-duplicate e-mails clean_list = [] # for loop to append non-duplicate emails to clean list for email in emails: if email not in clean_list: clean_list.append(email) return clean_list # close emails.txt file emails.close() # assigns no_duplicate_emails.txt to variable below no_duplicate_emails = open('no_duplicate_emails.txt', 'w') # function to convert clean_list 'list' elements in to strings for email in remove_duplicate(): # .strip() method to remove commas email = email.strip(',') no_duplicate_emails.write(f"E-mail: {email}\n") # close no_duplicate_emails.txt file no_duplicate_emails.close() 

Aquí está mi solución

 if __name__ == '__main__': f = open('temp.txt','w+') flag = False with open('file.txt') as fp: for line in fp: for temp in f: if temp == line: flag = True print('Found Match') break if flag == False: f.write(line) elif flag == True: flag = False f.seek(0) f.close() 

Si alguien está buscando una solución que use un hash y sea un poco más llamativo, esto es lo que actualmente uso:

 def remove_duplicate_lines(input_path, output_path): if os.path.isfile(output_path): raise OSError('File at {} (output file location) exists.'.format(output_path)) with open(input_path, 'r') as input_file, open(output_path, 'w') as output_file: seen_lines = set() def add_line(line): seen_lines.add(line) return line output_file.writelines((add_line(line) for line in input_file if line not in seen_lines)) 

Esta función no es perfectamente eficiente ya que el hash se calcula dos veces, sin embargo, estoy bastante seguro de que el valor se almacena en caché.