Encontrar archivos duplicados con Python

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *