Tecnología · GUÍA PRÁCTICA
BadZipFile en Python: separa estructura ZIP, CRC y archivos requeridos
Un prefijo PK, una lista correcta y una prueba de integridad responden preguntas distintas. Conserva la entrada antes de repararla.

Ante BadZipFile: File is not a zip file, conserva primero los bytes exactos y la excepción completa. El mensaje por sí solo no demuestra que renombrar, borrar una caché o truncar el archivo recupere el paquete esperado.
Distingue tres pasos: leer la estructura, leer los miembros sin errores CRC detectados y comprobar el contenido requerido. Cinco pruebas sintéticas pequeñas muestran por qué el éxito de un paso no sustituye al siguiente.
1. Conserva la entrada y la fase que falla
Registra ruta efectiva, tamaño, SHA-256, versión de Python y excepción completa. Mantén el original y trabaja sobre una copia. Un hash calculado localmente identifica los bytes; solo aporta autenticación al compararlo con una referencia independiente y fiable del mismo artefacto.
Si descargaste el archivo, confirma origen autorizado y versión, y comprueba que no guardaste una página de error o acceso. Si generaste el ZIP, cierra el escritor antes de leerlo: Python indica que el cierre escribe registros esenciales. No abras el original en modo w, que lo trunca.
2. Inspecciona estructura antes de leer todo
Para una muestra pequeña y de origen conocido, usa zipfile.is_zipfile(path), abre con with zipfile.ZipFile(path, "r") as z e inspecciona z.infolist(). Registra nombres, file_size, compress_size y compress_type. Si falla el constructor, no hubo una lista válida. PKWARE exige un registro final; las letras PK no prueban que el directorio esté completo.
Solo tras evaluar origen y recursos ejecuta z.testzip() dentro del contexto. Devuelve el primer nombre defectuoso o None si pasan sus comprobaciones. Conserva cualquier excepción como resultado pendiente. Los tamaños declarados orientan, pero no imponen límites: archivos grandes o no fiables requieren procesamiento aislado con límites efectivos.
3. Compara las cinco pruebas medidas
Creamos muestras pequeñas en BytesIO con Python3.12.14 sin extraerlas. El ZIP correcto de136bytes enumeró report.txt y testzip() devolvió None. Quitar su registro final de22bytes dejó114bytes todavía con PK, pero is_zipfile() devolvió False y el constructor lanzó BadZipFile.
Cambiar un byte del contenido sin actualizar CRC mantuvo136bytes. is_zipfile() siguió en True y el nombre aparecía, pero testzip() devolvió report.txt. Un ZIP vacío válido de22bytes dio True y None con lista vacía. Una muestra HTML de20bytes falló el formato. Son controles de fases, no un diagnóstico de tu archivo ni pruebas de todas las funciones ZIP.
4. Repara la causa demostrada y verifica la entrega
Para bytes incompletos o de otro formato, obtén una copia con nombre distinto por la ruta autorizada y compara la referencia del mismo artefacto. Si el productor no terminó el ZIP, regénéralo y ciérralo. Ante compresión o cifrado no compatibles, consulta las capacidades del lector antes de declarar corrupción. Python zipfile no maneja ZIP multiparte.
Conserva hash, resultado estructural, resultado CRC, nombres requeridos y prueba final en la aplicación. Un CRC correcto no autentica al editor, descarta contenido malicioso ni acredita una entrega completa. Si faltan archivos, detén la aceptación aunque testzip() devuelva None. Truncar el único original buscando una firma no recrea los datos ausentes.
