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.
- Importar o módulo
filecmp. - Chamar a função
filecmp.cmp()passando os caminhos e o parâmetroshallow=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.
- Importar o módulo
hashlib. - Instanciar o objeto
hashlib.sha256(). - Abrir o arquivo em modo de leitura binária (
rb). - Iterar sobre o arquivo lendo blocos fixos de 64KB (65536 bytes) e atualizar o objeto hash.
- Obter a representação hexadecimal com
hexdigest(). - 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
filecmp.cmp(caminho_arq1, caminho_arq2, shallow=False): executa a comparação entre dois arquivos.shallow=False: força a leitura do conteúdo do arquivo caso o tamanho e os metadados sejam idênticos, garantindo a comparação do conteúdo real. O valor padrão (True) considera apenasos.stat()(tamanho, tipo e data de modificação).
Módulo hashlib e manipulação de arquivos
hashlib.sha256(): inicializa a instância do algoritmo de hashing SHA-256."rb": modo de abertura do arquivo em leitura binária (read binary). Lê os dados como bytes brutos sem aplicar decodificação de texto.f.read(65536): lê um bloco de 64 KB (65.536 bytes) por vez do arquivo, evitando carregar o arquivo inteiro na memória RAM.iter(lambda: f.read(65536), b""): constrói um iterador que executa a leitura até retornar uma string de bytes vazia (b""), indicando o fim do arquivo (EOF).sha256_hash.update(byte_block): atualiza o estado do objeto hash com o bloco de bytes lido.sha256_hash.hexdigest(): retorna a digestão do hash calculada no formato de string hexadecimal.
Observações
- O erro
FileNotFoundErrorocorre quando o caminho informado para o arquivo não é localizado no sistema de arquivos. - No Windows, caminhos com barras invertidas podem gerar problemas de caractere de escape (
\n,\t). Deve-se utilizar barras normais (/) ou raw strings (r"C:\pasta\arquivo.pdf"). - Omitir
shallow=Falsena funçãofilecmp.cmp()faz com que a checagem considere arquivos de mesmo tamanho e mesmo timestamp de modificação como idênticos, sem comparar seus conteúdos.
Referências
- Documentação oficial da biblioteca padrão Python (
filecmpehashlib).