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
32
demandé sur Levon 2010-06-21 12:55:56

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  
9
répondu astronautlevel 2012-07-08 18:17:45

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
7
répondu UltramaticOrange 2014-02-24 19:15:38

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.

5
répondu marsl 2013-09-18 13:39:45

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?

2
répondu Uri Cohen 2017-05-23 12:00:29

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

1
répondu John Machin 2010-06-21 21:17:26

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.

-1
répondu Baffe Boyois 2010-06-22 07:03:55