En este artículo, codificaremos una secuencia de comandos de Python para encontrar archivos duplicados en el sistema de archivos o dentro de una carpeta en particular.
Método 1: Usar Filecmp
El módulo filecmp de python ofrece funciones para comparar directorios y archivos. La función cmp compara los archivos y devuelve True si parecen idénticos, de lo contrario False.
Syntax: filecmp.cmp(f1, f2, shallow)
Parámetros:
- f1: Nombre de un archivo
- f2: Nombre de otro archivo a comparar
- superficial: Con esto, establecemos si queremos comparar contenido o no.
Nota: El valor predeterminado es Verdadero, lo que garantiza que solo se compare la firma de los archivos, no el contenido.
Tipo de retorno: Valor booleano (Verdadero si los archivos son iguales, de lo contrario, Falso)
Ejemplo:
Asumimos aquí, por ejemplo, que «text_1.txt», «text_3.txt», «text_4.txt» son archivos que tienen el mismo contenido, y «text_2.txt», «text_5.txt» son archivos que tienen el mismo contenido. contenido.
Python3
# Importing Libraries import os from pathlib import Path from filecmp import cmp # list of all documents DATA_DIR = Path('/path/to/directory') files = sorted(os.listdir(DATA_DIR)) # List having the classes of documents # with the same content duplicateFiles = [] # comparison of the documents for file_x in files: if_dupl = False for class_ in duplicateFiles: # Comparing files having same content using cmp() # class_[0] represents a class having same content if_dupl = cmp( DATA_DIR / file_x, DATA_DIR / class_[0], shallow=False ) if if_dupl: class_.append(file_x) break if not if_dupl: duplicateFiles.append([file_x]) # Print results print(duplicateFiles)
Producción:
Método 2: Uso de hashing y diccionario
Para comenzar, este script obtendrá una sola carpeta o una lista de carpetas, luego, al recorrer la carpeta, encontrará archivos duplicados. A continuación, este script calculará un hash para cada archivo presente en la carpeta, independientemente de su nombre, y se almacenarán en forma de diccionario, siendo hash la clave y la ruta al archivo como valor.
- Tenemos que importar las bibliotecas os, sys, hashlib.
- Luego, el script itera sobre los archivos y llama a la función FindDuplicate() para encontrar duplicados.
Syntax: FindDuplicate(Path) Parameter: Path: Path to folder having files Return Type: Dictionary
- La función FindDuplicate() toma la ruta al archivo y llama a la función Hash_File()
- Luego, la función Hash_File() se usa para devolver HEXdigest de ese archivo. Para obtener más información sobre HEXdigest , lea aquí .
Syntax: Hash_File(path) Parameters: path: Path of file Return Type: HEXdigest of file
- Este MD5 Hash luego se agrega a un diccionario como clave con la ruta del archivo como su valor. Después de esto, la función FindDuplicate() devuelve un diccionario en el que las claves tienen varios valores, es decir, archivos duplicados.
- Ahora se llama a la función Join_Dictionary() que une el diccionario devuelto por FindDuplicate() y un diccionario vacío.
Syntax: Join_Dictionary(dict1,dict2) Parameters: dict1, dict2: Two different dictionaries Return Type: Dictionary
- Después de esto, imprimimos la lista de archivos que tienen el mismo contenido usando resultados.
Ejemplo:
Asumimos aquí, por ejemplo, que «text_1.txt», «text_3.txt», «text_4.txt» son archivos que tienen el mismo contenido, y «text_2.txt», «text_5.txt» son archivos que tienen el mismo contenido. contenido.
Python3
# Importing Libraries import os import sys from pathlib import Path import hashlib def FindDuplicate(SupFolder): # Duplic is in format {hash:[names]} Duplic = {} for file_name in files: # Path to the file path = os.path.join(folders, file_name) # Calculate hash file_hash = Hash_File(path) # Add or append the file path to Duplic if file_hash in Duplic: Duplic[file_hash].append(file_name) else: Duplic[file_hash] = [file_name] return Duplic # Joins dictionaries def Join_Dictionary(dict_1, dict_2): for key in dict_2.keys(): # Checks for existing key if key in dict_1: # If present Append dict_1[key] = dict_1[key] + dict_2[key] else: # Otherwise Stores dict_1[key] = dict_2[key] # Calculates MD5 hash of file # Returns HEX digest of file def Hash_File(path): # Opening file in afile afile = open(path, 'rb') hasher = hashlib.md5() blocksize=65536 buf = afile.read(blocksize) while len(buf) > 0: hasher.update(buf) buf = afile.read(blocksize) afile.close() return hasher.hexdigest() Duplic = {} folders = Path('path/to/directory') files = sorted(os.listdir(folders)) for i in files: # Iterate over the files # Find the duplicated files # Append them to the Duplic Join_Dictionary(Duplic, FindDuplicate(i)) # Results store a list of Duplic values results = list(filter(lambda x: len(x) > 1, Duplic.values())) if len(results) > 0: for result in results: for sub_result in result: print('\t\t%s' % sub_result) else: print('No duplicates found.')
Producción:
Publicación traducida automáticamente
Artículo escrito por vibhutijain99 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA