¿Por qué la función “is_zipfile” del módulo “zipfile” siempre devuelve “false”?

Según la documentación de python, la función zipfile.is_zipfile(filename) devuelve True si el nombre de archivo es un archivo ZIP válido, de lo contrario False.

He escrito mi guión como se indica a continuación, inicialmente pasé un argumento y obtuve el resultado “Falso”, pero para otros argumentos válidos también obtengo False todo el tiempo.

Guión:

 import zipfile for filename in [ r'D:\Python_Programs\B1', r'D:\Python_Programs\B2', r'D:\Python_Programs\B1+B2\20130105\144145_1.zip', 'NEWS.txt']: print (filename, zipfile.is_zipfile(filename)) 

Resultado:

 D:\Python_Programs\B1 False D:\Python_Programs\B2 False D:\Python_Programs\B1+B2\20130105\144145_1.zip False NEWS.txt False 

¿Alguien puede ayudarme por qué me sale Falso cada vez?

Como se determinó en los comentarios, is_zipfile devuelve False porque el archivo realmente no es un archivo zip, es un archivo RAR disfrazado. La extensión del archivo se puede cambiar involuntariamente. WinRAR puede tratar con archivos zip y RAR, por lo que puede abrir el archivo independientemente de su extensión real, pero los progtwigs que solo se ocupan de archivos zip no pueden abrirlo.

Los tipos de archivos generalmente se pueden identificar al examinar los primeros bytes de archivos y buscar las llamadas constantes mágicas. Este es exactamente el propósito del file(1) utilidad Unix file(1) . Un archivo zip generalmente se identifica por los dos bytes mágicos PK (más específicamente, los cuatro bytes 0x50 0x4B 0x74 0x08) al principio, aunque los archivos zip tienen la propiedad especial de que realmente están identificados por una estructura de datos particular al final de el archivo. El resultado de esto es algunas técnicas esteganográficas interesantes como este truco . Pero en la práctica no lo verá muy a menudo; casi todas (si no todas) las herramientas zip estándar crean archivos zip que comienzan con PK .