Wilberhg's blog

Comparação de Arquivos em Python

Entendendo o Conceito

A comparação de arquivos em Python pode ser feita avaliando metadados e conteúdo binário localmente ou calculando assinaturas criptográficas (hashes).

Quando a verificação ocorre no mesmo sistema de arquivos, o fluxo avalia primeiro o tamanho do arquivo; se forem iguais, o conteúdo é lido em blocos para confirmar a igualdade. Para sistemas distribuídos, locais distintos ou persistência em banco de dados, gera-se um hash SHA-256 do arquivo e compara-se apenas a string resultante.

Passo a Passo

Alternativa 1 - Comparação local usando filecmp

Para arquivos presentes no mesmo sistema de arquivos, utiliza-se o módulo nativo filecmp.

  1. Importar o módulo filecmp.
  2. Chamar a função filecmp.cmp() passando os caminhos e o parâmetro shallow=False.
import filecmp

def comparar_arquivos(caminho_arq1, caminho_arq2):
    sao_iguais = filecmp.cmp(caminho_arq1, caminho_arq2, shallow=False)
    
    if sao_iguais:
        print("Os arquivos são 100% idênticos!")
    else:
        print("Os arquivos são diferentes.")
    return sao_iguais

comparar_arquivos("documento1.pdf", "documento2.pdf")

Alternativa 2 - Comparação por Hash SHA-256 usando hashlib

Para arquivos em servidores distintos ou de grande porte, utiliza-se o módulo hashlib com leitura em blocos (chunks) para preservar o consumo de memória RAM.

  1. Importar o módulo hashlib.
  2. Instanciar o objeto hashlib.sha256().
  3. Abrir o arquivo em modo de leitura binária (rb).
  4. Iterar sobre o arquivo lendo blocos fixos de 64KB (65536 bytes) e atualizar o objeto hash.
  5. Obter a representação hexadecimal com hexdigest().
  6. Comparar as strings de hash resultantes.
import hashlib

def calcular_sha256(caminho_arquivo):
    sha256_hash = hashlib.sha256()
    
    with open(caminho_arquivo, "rb") as f:
        for byte_block in iter(lambda: f.read(65536), b""):
            sha256_hash.update(byte_block)
            
    return sha256_hash.hexdigest()

hash1 = calcular_sha256("documento1.pdf")
hash2 = calcular_sha256("documento2.pdf")

if hash1 == hash2:
    print("Os hashes coincidem! Os arquivos são idênticos.")
else:
    print("Os hashes são diferentes. Os arquivos mudaram.")

Explicando o código

Módulo filecmp

Módulo hashlib e manipulação de arquivos

Observações

Referências

  1. Documentação oficial da biblioteca padrão Python (filecmp e hashlib).

#automation #file-handling #filecmp #hashlib #python #sha256