Verificar o conteúdo de arquivos comparando SHA-256 antes e depois da cópia
Verifique o resultado da cópia comparando os hashes dos bytes dos arquivos, em vez de se basear apenas nos nomes ou tamanhos.
Conteúdo verificado 2026.09.19Inclui arquivos de exemplo
Ver o sumário
A tradução foi feita com IA. Confira o código, as unidades e os valores junto com o original. A revisão por falantes nativos de cada idioma ainda não foi concluída. 한국어
Para quem éIniciantes em Python que querem verificar se um documento copiado tem o mesmo conteúdo do original
Preparação
Tenha Python 3.12 ou superior disponível. Não são necessários pacotes adicionais.
Extraia o ZIP em uma nova pasta e mantenha example.py, original.txt e copy.txt juntos.
Comece praticando com os arquivos de texto fictícios incluídos. Não modifique os arquivos enquanto eles estiverem sendo lidos.
01Comparar os bytes em vez dos nomes dos arquivos
Arquivos podem ter conteúdos diferentes mesmo quando os nomes e os tamanhos são iguais. O SHA-256 lê os bytes do arquivo e calcula uma string de 64 caracteres hexadecimais (base 16). Os mesmos bytes produzem o mesmo hash, por isso esse método pode ser usado para verificar arquivos antes e depois da cópia.
Este exercício registra em um relatório se os hashes dos dois arquivos são iguais. Ele não exclui nem substitui arquivos. A igualdade dos hashes, por si só, não permite identificar o autor, confirmar se o arquivo veio de uma distribuição oficial ou garantir a ausência de malware.
02Conferir os arquivos incluídos
original.txt e copy.txt contêm a mesma frase fictícia de uma única linha. O example.py localiza e lê os dois arquivos a partir de sua própria localização. Os caminhos de entrada permanecem iguais mesmo que a pasta atual do terminal seja outra.
text
Worknote synthetic file comparison sample.
Mesmo que o texto pareça igual na tela, diferenças nas quebras de linha, na codificação de caracteres ou nos espaços ao final podem resultar em bytes e hashes diferentes. Os arquivos são comparados como estão, sem normalizar o texto nem remover espaços.
03Executar a primeira comparação
bash
python example.py
São criados uma nova pasta outputs e o arquivo comparison.json. O valor same_sha256=true no console significa que os hashes dos dois arquivos incluídos são iguais. Se outputs já existir, o programa para sem sobrescrever a pasta. Para executar novamente, extraia uma nova cópia do exemplo em outra pasta.
04Valores a conferir no relatório
Chave
Significado
algorithm
O algoritmo de hash utilizado: SHA-256
files
Os nomes dos dois arquivos comparados
sha256
A string de hash de 64 caracteres de cada arquivo
same_sha256
true se os dois hashes forem iguais; false se forem diferentes
A ordem dos nomes dos arquivos corresponde à ordem dos hashes. No exemplo incluído, o resultado esperado é true. A criação do arquivo de relatório e um resultado de comparação igual a true são coisas diferentes, portanto confira o valor diretamente.
05Pontos principais do código e exemplo completo
A função digest abre o arquivo no modo de leitura binária e atualiza o estado do hash lendo 1 MiB por vez. Ela não carrega o arquivo inteiro na memória de uma só vez. A pasta de resultados só é criada depois que as duas entradas são lidas por completo.
example.py
"""Compare two local synthetic files without changing them."""
import hashlib
import json
from pathlib import Path
BASE = Path(__file__).resolve().parent
def digest(path):
value = hashlib.sha256()
with path.open('rb') as stream:
for chunk in iter(lambda: stream.read(1024 * 1024), b''):
value.update(chunk)
return value.hexdigest()
def main():
output = BASE / 'outputs'
if output.exists():
raise ValueError('outputs already exists; choose a fresh extraction folder.')
left, right = BASE / 'original.txt', BASE / 'copy.txt'
hashes = [digest(left), digest(right)]
result = {'algorithm': 'SHA-256', 'files': [left.name, right.name],
'sha256': hashes, 'same_sha256': hashes[0] == hashes[1]}
output.mkdir(exist_ok=False)
with (output / 'comparison.json').open('x', encoding='utf-8') as stream:
json.dump(result, stream, indent=2)
stream.write('\n')
print('same_sha256=' + str(result['same_sha256']).lower())
print('Created outputs/comparison.json')
if __name__ == '__main__':
try:
main()
except (OSError, ValueError) as error:
raise SystemExit(f'Stopped: {error}') from error
06Verificar se conteúdos diferentes também são detectados
Extraia o ZIP novamente em uma nova pasta para manter esta execução separada do primeiro resultado.
Em copy.txt, troque sample por Sample e salve o arquivo.
Execute python example.py.
Confira se same_sha256=false e compare os dois hashes.
Mesmo mantendo a quantidade de caracteres, a alteração de um único byte permite detectar uma diferença na comparação dos hashes. Este código não determina se a divergência foi causada por corrupção de dados ou por uma edição intencional.
07O que verificar quando o programa para
Se um arquivo não existir ou não puder ser lido, o programa será encerrado com uma mensagem Stopped. Confira se o ZIP foi extraído por completo e se os nomes dos arquivos estão corretos. Se o erro ocorrer porque outputs já existe, extraia uma nova cópia em outra pasta e execute nela.
Se ocorrer um erro de gravação no disco, um relatório incompleto poderá permanecer na nova pasta outputs. Não use os resultados antes de conferir a mensagem de conclusão e o conteúdo do JSON.
08Limitações da comparação de hashes
Mesmo hashes criptográficos têm uma possibilidade teórica de colisão, portanto isso não é considerado uma prova de identidade matematicamente perfeita. Este exemplo é uma pequena ferramenta para verificações rotineiras de cópia. Para verificar a autenticidade de um download oficial, é necessário um procedimento separado de comparação com um hash ou uma assinatura fornecidos por uma fonte de distribuição confiável.
Alterações nos arquivos durante a leitura, falhas em unidades de rede, permissões de acesso e desempenho com arquivos grandes exigem verificações separadas. O código não cria snapshots dos arquivos de entrada nem os bloqueia.
Registro de execução e verificação
2026-09-19 · Windows 11 · CPython 3.12.14 · Biblioteca padrão
Confirmado true para arquivos idênticos e false para conteúdos diferentes com o mesmo comprimento
Confirmada a rejeição de uma entrada inexistente e de uma pasta de saída existente
Confirmada a igualdade dos hashes SHA-256 de entrada antes e depois da execução
Limites da verificação
Não foram verificadas modificações simultâneas, erros de disco nem unidades de rede.
A igualdade dos hashes não garante a identidade do autor nem a segurança do arquivo.
O código de exemplo, os nomes de arquivos e as chaves de entrada são mantidos como no original. Consulte também os comandos e os procedimentos de conferência do texto traduzido.
Material de prática original · Guarde os arquivos originais separadamente antes de executar.
Fontes de referência
As explicações e os exemplos são de elaboração própria. Os comportamentos e conceitos relacionados podem ser consultados nas fontes oficiais abaixo.
Percorra também as subpastas e registre o caminho, a extensão, o tamanho e a data de modificação de cada arquivo. Comece com 4 arquivos de exemplo pequenos e preserve os originais e os resultados existentes.
Combine em ordem arquivos CSV com a mesma estrutura de colunas e adicione a coluna source_file. Confira com dados pequenos os nomes de itens com vírgulas, as colunas ausentes e as saídas já existentes.
Confira em uma tabela os nomes atuais e os novos e verifique possíveis conflitos. Somente ao informar --apply são criadas cópias em uma nova pasta, preservando os originais.