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.
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. 한국어
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
Clave
Significado
algorithm
El algoritmo de hash utilizado: SHA-256
files
Los nombres de los dos archivos comparados
sha256
La cadena de hash de 64 caracteres de cada archivo
same_sha256
true 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
Vuelva a descomprimir el ZIP en una carpeta nueva para separar esta ejecución del primer resultado.
En copy.txt, cambie sample por Sample y guarde el archivo.
Ejecute python example.py.
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.
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 también las subcarpetas y registra la ruta, extensión, tamaño y fecha de modificación de cada archivo. Empieza con 4 archivos de ejemplo pequeños y conserva los originales y los resultados existentes.
Combina en orden archivos CSV con la misma estructura de columnas y añade la columna source_file. Comprueba con datos pequeños los nombres de artículos con comas, las columnas ausentes y las salidas ya existentes.
Revisa en una tabla los nombres actuales y los nuevos, y comprueba posibles conflictos. Solo al indicar --apply se crean copias en una carpeta nueva, conservando los originales.