unzipping File se traduit par " BadZipFile: File n'est pas un fichier zip"
j'ai deux fichiers zip, les deux s'ouvrent bien avec Windows Explorer et 7-zip.
cependant quand je les ouvre avec le module zipfile de Python [zipfile.ZipFile("fichier x.zip") ], l'un d'eux est ouvert, mais l'autre donne une erreur " BadZipfile: File is not a zip file
".
j'ai fait en sorte que ce dernier soit un fichier Zip valide en l'ouvrant avec 7-Zip et en regardant ses propriétés (dit 7Zip.ZIP.) Quand j'ouvre le fichier avec un éditeur de texte, les deux premiers les caractères sont "PK", ce qui montre qu'il s'agit bien d'un fichier zip.
j'utilise Python 2.5 et je n'ai vraiment aucune idée de comment faire pour cela. Je l'ai essayé à la fois avec Windows ainsi que Ubuntu et le problème existe sur les deux plates-formes.
mise à jour: Traceback à partir de Python 2.5.4 sur Windows:
Traceback (most recent call last):
File "<module1>", line 5, in <module>
zipfile.ZipFile("c:/temp/test.zip")
File "C:Python25libzipfile.py", line 346, in init
self._GetContents()
File "C:Python25libzipfile.py", line 366, in _GetContents
self._RealGetContents()
File "C:Python25libzipfile.py", line 378, in _RealGetContents
raise BadZipfile, "File is not a zip file"
BadZipfile: File is not a zip file
essentiellement quand la fonction _EndRecData
est appelée pour obtenir des données à partir de la fin du répertoire Central" enregistrer, la vérification de la longueur des commentaires échoue[endrec [7] == len(commentaire) ].
les valeurs des locaux dans la fonction _EndRecData
sont les suivantes:
END_BLOCK: 4096,
comment: 'x00',
data: 'xd6xf6x03x00x88,N8?<exf0qxa8x1cwKx87x0c(x82axeexc61N'1qNx0bx16K-x9dxd57wx0fxa31nxf3dNx9exb1sxffuxd1.....', (truncated)
endrec: ['PKx05x06', 0, 0, 4, 4, 268, 199515, 0],
filesize: 199806L,
fpin: <open file 'c:/temp/test.zip', mode 'rb' at 0x045D4F98>,
start: 4073
6 réponses
les fichiers nommés file peuvent confondre python - essayez de lui donner un autre nom. si cela STILL wont travailler, essayez ce code:
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
la solution d'astronautlevel fonctionne dans la plupart des cas, mais les données compressées et les CRCs dans le Zip peuvent aussi contenir les mêmes 4 octets. Vous devez faire un rfind
(pas find
), chercher à pos+20 et ensuite ajouter écrire \x00\x00
à la fin du fichier (dire aux applications zip que la longueur de la section 'commentaires' est de 0 bytes de long).
# 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:
# /q/how-to-find-the-position-of-central-directory-in-a-zip-file-41994/"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
je tombe sur le même problème. Mon problème était que c'était un gzip, au lieu d'un fichier zip. Je suis passé à la classe gzip.GzipFile
et ça a fonctionné comme un charme.
j'ai eu le même problème et j'ai pu résoudre ce problème pour mes fichiers, voir ma réponse à zipfile cant gérer un certain type de données zip?
afficher le traceback complet que vous avez obtenu de Python -- cela peut donner un indice sur ce qu'est le problème spécifique. sans réponse: quel logiciel a produit le mauvais fichier, et sur quelle plate-forme?
mise à jour: Traceback indique un problème de détection de l'enregistrement" fin du répertoire Central "dans le fichier -- voir la fonction _EndRecData commençant à la ligne 128 de C:\Python25\Lib\zipfile.py
Suggestions:
(1) Trace à travers la fonction ci-dessus
(2) l'Essayer sur la dernière Python
(3) répondez à la question ci-dessus.
(4) Lire ce et tout ce que google("BadZipfile: File is not a zip file")
a trouvé qui semble être pertinent
avez-vous essayé un nouveau python, ou si c'est trop de problèmes, tout simplement un nouveau zipfile.py Je ne sais pas. J'ai utilisé avec succès une copie de zipfile.py de Python 2.6.2 (le plus récent à l'époque) avec Python 2.5 afin d'ouvrir certains fichiers zip qui n'étaient pas pris en charge par Py2.Module 5s zipfile.