python - password - descomprimir los resultados del archivo en "BadZipFile: el archivo no es un archivo zip"
zipfile python 3 (6)
¿Has probado una nueva pitón, o si eso es demasiado problema, simplemente un zipfile.py más nuevo? He utilizado con éxito una copia de zipfile.py de Python 2.6.2 (la última en ese momento) con Python 2.5 para abrir algunos archivos zip que no eran compatibles con el módulo de archivo zip de Py2.5.
Tengo dos archivos zip, ambos se abren bien con Windows Explorer y 7-zip.
Sin embargo, cuando los abro con el módulo zipfile de Python [zipfile.ZipFile ("filex.zip")], uno de ellos se abre pero el otro da error " BadZipfile: File is not a zip file
".
Me he asegurado de que este último sea un archivo Zip válido abriéndolo con 7-Zip y mirando sus propiedades (dice 7Zip.ZIP). Cuando abro el archivo con un editor de texto, los primeros dos caracteres son "PK", mostrando que es de hecho un archivo zip.
Estoy usando Python 2.5 y realmente no tengo ni idea de cómo hacerlo. Lo intenté tanto con Windows como con Ubuntu y existe un problema en ambas plataformas.
Actualización: Trazabilidad desde Python 2.5.4 en Windows:
Traceback (most recent call last):
File "<module1>", line 5, in <module>
zipfile.ZipFile("c:/temp/test.zip")
File "C:/Python25/lib/zipfile.py", line 346, in init
self._GetContents()
File "C:/Python25/lib/zipfile.py", line 366, in _GetContents
self._RealGetContents()
File "C:/Python25/lib/zipfile.py", line 378, in _RealGetContents
raise BadZipfile, "File is not a zip file"
BadZipfile: File is not a zip file
Básicamente, cuando se _EndRecData
función _EndRecData
para obtener datos del registro de End of Central Directory ", el proceso de finalización de comentarios falla [endrec [7] == len (comment)].
Los valores de los locales en la función _EndRecData
son los siguientes:
END_BLOCK: 4096,
comment: ''/x00'',
data: ''/xd6/xf6/x03/x00/x88,N8?<e/xf0q/xa8/x1cwK/x87/x0c(/x82a/xee/xc61N/'1qN/x0b/x16K-/x9d/xd57w/x0f/xa31n/xf3dN/x9e/xb1s/xffu/xd1/.....'', (truncated)
endrec: [''PK/x05/x06'', 0, 0, 4, 4, 268, 199515, 0],
filesize: 199806L,
fpin: <open file ''c:/temp/test.zip'', mode ''rb'' at 0x045D4F98>,
start: 4073
La solución de astronautlevel funciona en la mayoría de los casos, pero los datos comprimidos y los CRC en el Zip también pueden contener los mismos 4 bytes. Debería hacer un rfind
(no find
), buscar pos + 20 y luego agregar write /x00/x00
al final del archivo (decir a las aplicaciones zip que la longitud de la sección de ''comentarios'' es de 0 bytes de longitud).
# HACK: See http://bugs.python.org/issue10694
# The zip file generated is correct, but because of extra data after the ''central directory'' section,
# Some version of python (and some zip applications) can''t read the file. By removing the extra data,
# we ensure that all applications can read the zip without issue.
# The ZIP format: http://www.pkware.com/documents/APPNOTE/APPNOTE-6.3.0.TXT
# Finding the end of the central directory:
# http://.com/questions/8593904/how-to-find-the-position-of-central-directory-in-a-zip-file
# http://.com/questions/20276105/why-cant-python-execute-a-zip-archive-passed-via-stdin
# This second link is only losely related, but echos the first, "processing a ZIP archive often requires backwards seeking"
content = zipFileContainer.read()
pos = content.rfind(''/x50/x4b/x05/x06'') # reverse find: this string of bytes is the end of the zip''s central directory.
if pos>0:
zipFileContainer.seek(pos+20) # +20: see secion V.I in ''ZIP format'' link above.
zipFileContainer.truncate()
zipFileContainer.write(''/x00/x00'') # Zip file comment length: 0 byte length; tell zip applications to stop reading.
zipFileContainer.seek(0)
return zipFileContainer
Los archivos con el nombre de archivo pueden confundir a python; intenta nombrarlo de otra forma. si TODAVÍA no funciona, prueba este código:
def fixBadZipfile(zipFile):
f = open(zipFile, ''r+b'')
data = f.read()
pos = data.find(''/x50/x4b/x05/x06'') # End of central directory signature
if (pos > 0):
self._log("Trancating file at location " + str(pos + 22)+ ".")
f.seek(pos + 22) # size of ''ZIP end of central directory record''
f.truncate()
f.close()
else:
# raise error, file is truncated
Me encuentro con el mismo problema. Mi problema era que era un gzip en lugar de un archivo zip. gzip.GzipFile
a la clase gzip.GzipFile
y funcionó como un amuleto.
Muestra el rastreo completo que obtuviste de Python; esto puede dar una pista sobre cuál es el problema específico. Sin respuesta: ¿Qué software produjo el archivo incorrecto y en qué plataforma?
Actualización: Trazabilidad indica que tiene problemas para detectar el registro "Fin del directorio central" en el archivo; consulte la función _EndRecData que comienza en la línea 128 de C: / Python25 / Lib / zipfile.py
Sugerencias:
(1) Rastrear a través de la función anterior
(2) Pruébalo en el último Python
(3) Responda la pregunta anterior.
(4) Lea this y cualquier otra cosa que encuentre en google("BadZipfile: File is not a zip file")
que parece ser relevante
Tuve el mismo problema y pude resolver este problema para mis archivos, ¿ves que mi respuesta en zipfile no puede manejar algún tipo de datos zip?