Scripts e automação de arquivos

Verifique o conteúdo de arquivos comparando hashes SHA-256 antes e depois da cópia

Verifique o resultado de uma cópia de arquivo comparando hashes dos bytes do arquivo, em vez de confiar apenas em 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. English

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 posterior pronto. Nenhum pacote adicional é necessário.
  • Extraia o ZIP em uma nova pasta e mantenha example.py, original.txt e copy.txt juntos.
  • Comece praticando com os arquivos de texto sintéticos incluídos. Não modifique os arquivos enquanto eles estiverem sendo lidos.

01Compare bytes em vez de nomes de arquivos

Files podem ter conteúdos diferentes mesmo quando seus names e sizes são iguais. SHA-256 lê os file bytes e calcula uma string hexadecimal de 64 caracteres (base 16). Os mesmos bytes produzem o mesmo hash, portanto isso pode ser usado para verificar arquivos antes e depois da cópia.

Este exercício registra em um report se os dois files têm o mesmo hash. Ele não exclui nem substitui arquivos. Um hash correspondente, por si só, não estabelece quem criou o file, se ele é uma official distribution ou se está livre de malware.

02Verifique os arquivos incluídos

original.txt e copy.txt contêm a mesma frase sintética de uma linha. example.py localiza e lê os dois files em relação à própria localização. Os input paths permanecem os mesmos mesmo que a current folder do terminal seja diferente.

text
Worknote synthetic file comparison sample.

Mesmo que o text pareça igual na tela, diferenças em line endings, character encoding ou trailing spaces podem produzir bytes e hashes diferentes. Os files são comparados como estão, sem limpar o texto nem remover espaços.

03Execute a primeira comparação

bash
python example.py

Uma nova pasta outputs e um arquivo comparison.json são criados. O console value same_sha256=true significa que os hashes dos dois files incluídos correspondem. Se outputs já existir, o programa para sem sobrescrevê-lo. Para executar o exemplo novamente, extraia uma cópia nova em outra pasta.

04Valores a verificar no relatório

KeySignificado
algorithmO hash algorithm usado: SHA-256
filesOs nomes dos dois files comparados
sha256A hash string de 64 caracteres de cada file
same_sha256true se os dois hashes corresponderem, false caso contrário

Os file names e hashes aparecem na mesma ordem. O resultado esperado para o exemplo incluído é true. Criar um report file e obter um comparison result true são coisas diferentes, portanto verifique o próprio valor.

05Como o código funciona e o exemplo completo

A digest function abre um file em binary read mode e atualiza o hash state lendo 1 MiB por vez. Ela não carrega o file inteiro na memória de uma vez. A results folder é criada somente depois que ambos os input files foram lidos completamente.

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

06Verifique se conteúdos diferentes 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, altere sample para Sample e salve o arquivo.
  3. Execute python example.py.
  4. Verifique se same_sha256=false e compare os dois hashes.

Mesmo que o character count permaneça igual, alterar um único byte pode revelar uma diferença na hash comparison. Este código não determina se o mismatch foi causado por corruption ou intentional editing.

07O que verificar quando o programa para

Se um file estiver ausente ou não puder ser lido, o programa termina com uma mensagem Stopped. Verifique se todo o archive foi extraído e se os file names estão corretos. Se o erro for causado por uma pasta outputs existente, extraia uma cópia nova em outra pasta e execute-a lá.

Se ocorrer um disk write error, um report incompleto pode permanecer na nova pasta outputs. Não use os results até verificar a completion message e o conteúdo JSON.

08Limitações da comparação por hash

Mesmo cryptographic hashes têm uma possibilidade teórica de collisions, portanto isso não é descrito como uma prova matematicamente perfeita de identidade. Este exemplo é uma pequena ferramenta para verificações rotineiras de cópia. Verificar a autenticidade de uma official download exige um procedimento separado para compará-la com um hash ou signature fornecido por um trusted distributor.

Files que mudam durante a leitura, network drive failures, access permissions e performance com large files exigem verificações separadas. O código não cria snapshots dos input files nem os bloqueia.

Registro de execução e verificação

2026-09-19 · Windows 11 · CPython 3.12.14 · Biblioteca padrão

  • Foi confirmado true para arquivos idênticos e false para conteúdos diferentes do mesmo comprimento
  • Foi confirmado o bloqueio de input ausente e de uma output folder existente
  • Foi confirmado que os hashes SHA-256 de input corresponderam antes e depois da execução
Limites da verificação
  • Concurrent modification, disk errors e network drives não foram verificados.
  • Hashes correspondentes não garantem 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.