Scripts y automatización de archivos

Comprobar el contenido de archivos comparando hashes SHA-256 antes y después de copiarlos

Comprueba el resultado de una copia de archivo comparando hashes de los bytes del archivo en lugar de confiar únicamente en los nombres o tamaños.

Ver el índice

La traducción se ha realizado con IA. Comprueba el código, las unidades y los valores junto con el original. La revisión por hablantes nativos de cada idioma aún no se ha completado. English

Para quién esPrincipiantes de Python que quieren comprobar si un documento copiado tiene el mismo contenido que el original

Preparación
  • Ten preparado Python 3.12 o posterior. No se requieren paquetes adicionales.
  • Extrae el ZIP en una carpeta nueva y mantén juntos example.py, original.txt y copy.txt.
  • Empieza practicando con los archivos de texto sintéticos incluidos. No modifiques los archivos mientras se estén leyendo.

01Comparar bytes en lugar de nombres de archivo

Los files pueden tener contenidos diferentes incluso cuando sus names y sizes son iguales. SHA-256 lee los file bytes y calcula una string hexadecimal de 64 caracteres (base 16). Los mismos bytes producen el mismo hash, por lo que puede utilizarse para comprobar archivos antes y después de copiarlos.

Este ejercicio registra en un report si los dos files tienen el mismo hash. No elimina ni sustituye archivos. Que el hash coincida no demuestra por sí solo quién creó el file, si pertenece a una official distribution ni si está libre de malware.

02Comprobar los archivos incluidos

original.txt y copy.txt contienen la misma frase sintética de una sola línea. example.py localiza y lee ambos files en relación con su propia ubicación. Los input paths permanecen iguales aunque la current folder de la terminal sea diferente.

text
Worknote synthetic file comparison sample.

Aunque el text parezca igual en pantalla, diferencias en line endings, character encoding o trailing spaces pueden producir bytes y hashes diferentes. Los files se comparan tal cual, sin limpiar el texto ni eliminar espacios.

03Ejecutar la primera comparación

bash
python example.py

Se crean una nueva carpeta outputs y un archivo comparison.json. El console value same_sha256=true significa que los hashes de los dos files incluidos coinciden. Si outputs ya existe, el programa se detiene sin sobrescribirlo. Para volver a ejecutar el ejemplo, extrae una copia nueva en otra carpeta.

04Valores que deben comprobarse en el informe

KeySignificado
algorithmEl hash algorithm utilizado: SHA-256
filesLos nombres de los dos files comparados
sha256La hash string de 64 caracteres de cada file
same_sha256true si los dos hashes coinciden, false en caso contrario

Los file names y hashes aparecen en el mismo orden. El resultado esperado para el ejemplo incluido es true. Crear un report file y obtener un comparison result true son cosas distintas, así que comprueba el valor en sí.

05Cómo funciona el código y el ejemplo completo

La digest function abre un file en binary read mode y actualiza el hash state leyendo 1 MiB cada vez. No carga todo el file en memoria de una vez. La results folder se crea únicamente después de haber leído completamente ambos input files.

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

06Comprobar si se detectan contenidos diferentes

  1. Extrae de nuevo el ZIP en una carpeta nueva para mantener esta ejecución separada del primer resultado.
  2. En copy.txt, cambia sample por Sample y guarda el archivo.
  3. Ejecuta python example.py.
  4. Comprueba que same_sha256=false y compara los dos hashes.

Aunque el character count permanezca igual, cambiar un solo byte puede revelar una diferencia en la hash comparison. Este código no determina si el mismatch se debe a corruption o intentional editing.

07Qué comprobar cuando el programa se detiene

Si falta un file o no puede leerse, el programa termina con un mensaje Stopped. Comprueba que se haya extraído todo el archive y que los file names sean correctos. Si el error se debe a una carpeta outputs existente, extrae una copia nueva en otra carpeta y ejecútala allí.

Si se produce un disk write error, puede quedar un report incompleto en la nueva carpeta outputs. No utilices los results hasta haber comprobado el completion message y el contenido JSON.

08Limitaciones de la comparación mediante hashes

Incluso los cryptographic hashes tienen una posibilidad teórica de collisions, por lo que esto no se describe como una prueba matemáticamente perfecta de identidad. Este ejemplo es una pequeña herramienta para comprobaciones rutinarias de copias. Verificar la autenticidad de una official download requiere un procedimiento separado para compararla con un hash o signature proporcionado por un trusted distributor.

Los files que cambian mientras se leen, network drive failures, access permissions y performance con large files requieren comprobaciones separadas. El código no crea snapshots ni bloquea los input files.

Registro de ejecución y verificación

2026-09-19 · Windows 11 · CPython 3.12.14 · Biblioteca estándar

  • Se confirmó true para archivos idénticos y false para contenidos diferentes de la misma longitud
  • Se confirmó el rechazo de input ausente y de una output folder existente
  • Se confirmó que los hashes SHA-256 de input coincidieron antes y después de la ejecución
Límites de la verificación
  • No se verificaron concurrent modification, disk errors ni network drives.
  • Que los hashes coincidan no garantiza la identidad del autor ni la seguridad del archivo.

Criterios de redacción y verificación de todo el sitio

Archivos de ejemplo para ejecutar

Incluye código, datos de entrada e instrucciones de ejecución. Extrae el ZIP y lee primero README.txt.

Descargar ZIP de ejemplo

El código de ejemplo, los nombres de archivo y las claves de entrada se mantienen como en el original. Consulta también los comandos y los pasos de comprobación del texto traducido.

Material de práctica original · Guarda los archivos originales por separado antes de ejecutarlo.

Fuentes de referencia

Las explicaciones y los ejemplos son de elaboración propia. Puedes consultar los comportamientos y conceptos relacionados en las siguientes fuentes oficiales.