web-dev-qa-db-ja.com

ファイルを解凍すると、「BadZipFile:ファイルはZipファイルではありません」という結果になります

2つのZipファイルがありますが、どちらもWindowsエクスプローラーと7-Zipでうまく開きます。

ただし、Pythonのzipfileモジュール[zipfile.ZipFile( "filex.Zip")]でそれらを開くと、そのうちの1つが開かれますが、もう1つはエラー "BadZipfile: File is not a Zip file"を返します。

7-Zipで開き、そのプロパティ(7Zip.ZIPなど)を見て、後者が有効なZipファイルであることを確認しました。テキストエディタでファイルを開くと、最初の2文字は「PK」であり、実際にZipファイルであることを示しています。

私はPython 2.5を使用しており、実際にこれを実行する方法がわかりません。WindowsとUbuntuの両方で試してみましたが、両方のプラットフォームに問題があります。

更新: Traceback from Python 2.5.4 on 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

基本的に、[中央ディレクトリの終わり]レコードからデータを取得するために_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
36
sharjeel

fileという名前のファイルは混乱する可能性がありますpython-別の名前を付けてみてください。if[〜#〜] 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  
12
astronautlevel

astronautlevelのソリューションはほとんどの場合に機能しますが、Zipの圧縮データとCRCにも同じ4バイトを含めることができます。 rfindfindではなく)を実行し、pos + 20をシークしてから、書き込み\x00\x00ファイルの最後まで(Zipアプリケーションに「コメント」セクションの長さが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
9

私は同じ問題に遭遇します。私の問題は、Zipファイルではなくgzipであったことです。クラスに切り替えたgzip.GzipFileそしてそれは魅力のように働いた。

6
marsl

私は同じ問題を抱えていて、ファイルについてこの問題を解決することができました。 zipfileがいくつかのタイプのZipデータを処理できないという答えを参照してください。

2
Uri Cohen

Python-これにより、特定の問題が何であるかについてのヒントが得られる場合があります。未回答:どのソフトウェアが不良ファイルを生成し、どのプラットフォームで使用されましたか?

更新:トレースバックは、ファイル内の「End of Central Directory」レコードの検出に問題があることを示しています-C:\ Python25\Lib\zipfile.pyの128行目から始まる関数_EndRecDataを参照してください

提案:
(1)上記の機能をトレースします
(2)最新のPythonで試してください
(3)上記の質問に答えてください。
(4)読み取り this および関連するように見えるgoogle("BadZipfile: File is not a Zip file")によって検出されたその他のもの

1
John Machin

破損したファイルを含むZipファイルがあり、Zipを解凍するとbadzipfileエラーが発生する場合があります。しかし、これらのエラーを無視してZipファイルを正常に解凍する7Zip winrarなどのツールがあります。サブプロセスを作成し、このコードを使用して、BadZipFileエラーが発生することなくZipファイルを解凍できます。

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)
0
vsnahar