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.
Contenido revisado 2026.09.19Incluye archivos de ejemplo
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
Key
Significado
algorithm
El hash algorithm utilizado: SHA-256
files
Los nombres de los dos files comparados
sha256
La hash string de 64 caracteres de cada file
same_sha256
true 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
Extrae de nuevo el ZIP en una carpeta nueva para mantener esta ejecución separada del primer resultado.
En copy.txt, cambia sample por Sample y guarda el archivo.
Ejecuta python example.py.
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.
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.
Recorre las subcarpetas y registra en una tabla las rutas, extensiones, tamaños y fechas de modificación de los archivos. Empieza con 4 archivos de ejemplo pequeños, manteniendo intactos los originales y los resultados existentes.
Combina en orden archivos CSV con la misma estructura de columnas y añade una columna source_file. Usa conjuntos de datos pequeños para comprobar nombres de elementos con comas, columnas faltantes y salidas ya existentes.
Compara los nombres antiguos y nuevos en una tabla y comprueba conflictos. Solo un --apply explícito crea copias en una carpeta nueva, manteniendo los originales.