我有两个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
答案 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文件。