Scripts y automatización de archivos

Comprobar el contenido de un archivo comparando SHA-256 antes y después de copiarlo

Compruebe el resultado de una copia comparando los hashes de los bytes de los archivos, en lugar de basarse únicamente en sus 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. 한국어

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

Preparación
  • Prepare Python 3.12 o posterior. No se necesitan paquetes adicionales.
  • Descomprima el ZIP en una carpeta nueva y mantenga juntos example.py, original.txt y copy.txt.
  • Empiece practicando con los archivos de texto ficticios incluidos. No modifique los archivos mientras se están leyendo.

01Comparar los bytes en lugar de los nombres de archivo

Los archivos pueden tener contenidos distintos aunque sus nombres y tamaños coincidan. SHA-256 lee los bytes del archivo y calcula una cadena de 64 caracteres en hexadecimal (base 16). Los mismos bytes generan el mismo hash, por lo que puede utilizarse para comprobar archivos antes y después de copiarlos.

Este ejercicio registra en un informe si los hashes de los dos archivos coinciden. No elimina ni sustituye archivos. La coincidencia de los hashes por sí sola no permite determinar quién creó un archivo, si procede de una distribución oficial o si está libre de malware.

02Comprobar los archivos incluidos

original.txt y copy.txt contienen la misma frase ficticia de una sola línea. example.py busca y lee los dos archivos tomando como referencia su propia ubicación. Las rutas de entrada son las mismas aunque la carpeta actual de la terminal sea otra.

text
Worknote synthetic file comparison sample.

Aunque el texto parezca igual en pantalla, las diferencias en los saltos de línea, la codificación de caracteres o los espacios al final pueden producir bytes y hashes distintos. Los archivos se comparan tal cual, sin normalizar el texto ni eliminar espacios.

03Ejecutar la primera comparación

bash
python example.py

Se crean una carpeta outputs nueva y el archivo comparison.json. El valor same_sha256=true en la consola significa que los hashes de los dos archivos incluidos coinciden. Si outputs ya existe, el programa se detiene sin sobrescribir la carpeta. Para volver a ejecutarlo, descomprima una copia nueva del ejemplo en otra carpeta.

04Valores que debe comprobar en el informe

ClaveSignificado
algorithmEl algoritmo de hash utilizado: SHA-256
filesLos nombres de los dos archivos comparados
sha256La cadena de hash de 64 caracteres de cada archivo
same_sha256true si los dos hashes coinciden; false si son distintos

El orden de los nombres de archivo coincide con el de los hashes. En el ejemplo incluido se espera true. Que se haya creado el archivo de informe y que el resultado de la comparación sea true son cosas distintas, así que compruebe el valor directamente.

05Puntos clave del código y ejemplo completo

La función digest abre el archivo en modo de lectura binaria y actualiza el estado del hash leyendo bloques de 1 MiB. No carga todo el archivo en memoria de una sola vez. La carpeta de resultados solo se crea después de leer por completo ambas entradas.

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 también se detectan contenidos distintos

  1. Vuelva a descomprimir el ZIP en una carpeta nueva para separar esta ejecución del primer resultado.
  2. En copy.txt, cambie sample por Sample y guarde el archivo.
  3. Ejecute python example.py.
  4. Compruebe que same_sha256=false y compare los dos hashes.

Aunque se mantenga el mismo número de caracteres, cambiar un solo byte permite detectar una diferencia al comparar los hashes. Este código no determina si la discrepancia se debe a corrupción de datos o a una edición intencionada.

07Qué comprobar cuando el programa se detiene

Si falta un archivo o no se puede leer, el programa termina con un mensaje Stopped. Compruebe que haya descomprimido el archivo ZIP completo y que los nombres de archivo sean correctos. Si el error se debe a una carpeta outputs existente, descomprima una copia nueva en otra carpeta y ejecútela allí.

Si se produce un error de escritura en disco, puede quedar un informe incompleto en la nueva carpeta outputs. No utilice los resultados hasta haber comprobado el mensaje de finalización y el contenido del JSON.

08Limitaciones de la comparación de hashes

Incluso los hashes criptográficos tienen una posibilidad teórica de colisión, por lo que no se considera una demostración matemáticamente perfecta de identidad. Este ejemplo es una pequeña herramienta para comprobaciones habituales de copias. Para verificar la autenticidad de una descarga oficial, se necesita un procedimiento aparte que la compare con un hash o una firma proporcionados por una fuente de distribución de confianza.

Los cambios en los archivos durante la lectura, los fallos de unidades de red, los permisos de acceso y el rendimiento con archivos grandes requieren comprobaciones por separado. El código no crea instantáneas de los archivos de entrada ni los bloquea.

Registro de ejecución y verificación

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

  • Confirmado true para archivos idénticos y false para contenidos distintos de la misma longitud
  • Confirmado el rechazo de una entrada inexistente y de una carpeta de salida existente
  • Confirmada la coincidencia de los hashes SHA-256 de entrada antes y después de la ejecución
Límites de la verificación
  • No se verificaron las modificaciones simultáneas, los errores de disco ni las unidades de red.
  • La coincidencia de los hashes 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.