Scripts e automação de arquivos

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.

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

ChaveSignificado
algorithmO algoritmo de hash utilizado: SHA-256
filesOs nomes dos dois arquivos comparados
sha256A string de hash de 64 caracteres de cada arquivo
same_sha256true 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

  1. Extraia o ZIP novamente em uma nova pasta para manter esta execução separada do primeiro resultado.
  2. Em copy.txt, troque sample por Sample e salve o arquivo.
  3. Execute python example.py.
  4. 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.

Princípios de redação e verificação de todo o site

Arquivos de exemplo para executar

Inclui código, dados de entrada e instruções de execução. Extraia o ZIP e leia primeiro o README.txt.

Baixar ZIP de exemplo

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.