解压缩文件导致“BadZipFile:文件不是zip文件”

时间:2010-06-21 08:55:56

标签: python zipfile

我有两个zip文件,它们都可以通过Windows资源管理器和7-zip打开。

然而,当我用Python的zipfile模块[zipfile.ZipFile(“filex.zip”)]打开它们时,其中一个被打开但另一个给出错误“BadZipfile: File is not a zip file”。

我确保后者是一个有效的Zip文件,用7-Zip打开并查看其属性(7Zip.ZIP说)。当我用文本编辑器打开文件时,前两个字符是“PK”,表明它确实是一个zip文件。

我正在使用Python 2.5并且真的没有任何线索如何解决这个问题。我已经尝试过使用Windows和Ubuntu,两个平台都存在问题。

更新:Windows上的Python 2.5.4回溯:

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

基本上,当调用_EndRecData函数从中央目录结束“记录中获取数据时,注释长度检出失败[endrec [7] == len(comment)]。

_EndRecData函数中的本地值如下:

 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

8 个答案:

答案 0 :(得分:12)

名为file的文件可能会混淆python - 尝试将其命名为其他内容。如果 STILL 无效,请尝试以下代码:

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  

答案 1 :(得分:9)

astronautlevel的解决方案适用于大多数情况,但Zip中的压缩数据和CRC也可以包含相同的4个字节。您应该rfind(不是find),寻找pos + 20,然后在文件末尾添加写\x00\x00(告诉zip应用程序“注释”的长度section是0个字节长。)


    # 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://stackoverflow.com/questions/8593904/how-to-find-the-position-of-central-directory-in-a-zip-file
    #   http://stackoverflow.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

答案 2 :(得分:6)

我遇到了同样的问题。我的问题是它是一个gzip而不是一个zip文件。我转到班级gzip.GzipFile,它就像一个魅力。

答案 3 :(得分:2)

我遇到了同样的问题,能够为我的文件解决这个问题,请参阅我的回答 zipfile cant handle some type of zip data?

答案 4 :(得分:1)

显示从Python获得的完整回溯 - 这可能会提示具体问题是什么。 未答复:哪些软件产生了错误的文件,以及在哪个平台上?

更新:Traceback表示在检测到文件中的“中心目录结束”记录时出现问题 - 请参阅从C:\ Python25 \ Lib \ zipfile.py

的第128行开始的函数_EndRecData

建议:
(1)通过上述功能追踪
(2)尝试使用最新的Python (3)回答上述问题 (4)阅读this以及google("BadZipfile: File is not a zip file")找到的任何看似相关的内容

答案 5 :(得分:0)

有时,压缩文件中包含损坏的文件,解压缩后会出现badzipfile错误。但是有些工具例如7zip winrar会忽略这些错误并成功解压缩zip文件。您可以创建一个子进程,并使用此代码解压缩zip文件,而不会出现BadZipFile错误。

import subprocess
ziploc = "C:/Program Files/7-Zip/7z.exe" #location where 7zip is installed
cmd = [ziploc, 'e',your_Zip_file.zip ,'-o'+ OutputDirectory ,'-r' ] 
sp = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)

答案 6 :(得分:0)

我遇到了这个问题,正在寻找一个好的、干净的解决方案;但是直到我找到 this answer 才找到解决办法。我遇到了@marsl(在答案中)遇到的同样问题。就我而言,它是一个 gzipfile 而不是 zipfile。

我可以用这种方法解压缩我的 gzip 文件:

with tarfile.open(archive_path, "r:gz") as gzip_file:
    gzip_file.extractall()

答案 7 :(得分:-1)

您是否尝试过更新的python,或者如果这样做太麻烦,只需更新的zipfile.py?我已成功使用Python 2.6.2(当时最新版本)的zipfile.py副本和Python 2.5,以打开一些Py2.5s zipfile模块不支持的zip文件。