13

Windows 7 (64 ビット) で Python 2.7 を使用しています。ZipFile モジュールで zip ファイルを解凍しようとすると、次のエラーが表示されます:-

Traceback (most recent call last):
  File "unzip.py", line 8, in <module>
    z.extract(name)
  File "C:\Python27\lib\zipfile.py", line 950, in extract
    return self._extract_member(member, path, pwd)
  File "C:\Python27\lib\zipfile.py", line 993, in _extract_member
    source = self.open(member, pwd=pwd)
  File "C:\Python27\lib\zipfile.py", line 897, in open
    raise BadZipfile, "Bad magic number for file header"
zipfile.BadZipfile: Bad magic number for file header

WinRAR は、抽出しようとしているファイルを正常に抽出できました。ファイルを抽出するために使用したコードは次のとおりですmyzip.zip

from zipfile import ZipFile
z = ZipFile('myzip.zip')   //myzip.zip contains just one file, a password protected pdf        
for name in z.namelist():
    z.extract(name)

このコードは、WinRAR を使用して作成した他の多くの zip ファイルでは正常に機能しますが、myzip.zip

次の行にコメントを付けてみましたPython27\Lib\zipfile.py:-

if fheader[0:4] != stringFileHeader:
   raise BadZipfile, "Bad magic number for file header"

しかし、これは本当に役に立ちませんでした。これを有効にしてコードを実行すると、シェルにダンプが表示されます。

4

2 に答える 2

15

正しい ZIP ファイルの先頭は常に「\x50\x4B\x03\x04」です。次のコードを使用して、ファイルが本当に ZIP ファイルであるかどうかをテストできます。

with open('/path/to/file', 'rb') as MyZip:
  print(MyZip.read(4))

ファイルのヘッダーが出力されるので、確認できます。

UPDATE Strange、testzip()、および他のすべての関数は正常に機能します。そのようなコードを試しましたか?

with zipfile.GzipFile('/path/to/file') as Zip:
  for ZipMember in Zip.infolist():
    Zip.extract(ZipMember, path='/dir/where/to/extract', pwd='your-password')
于 2011-10-09T17:14:56.047 に答える
3

たとえば、拡張子が .zip の RAR ファイルではなく、実際に ZIP ファイルを開いていることを確認してください。適切な zip ファイルにはヘッダーがありますが、この場合は見つかりませんでした。

モジュールはzipfilezip ファイルのみを開くことができます。WinRAR は他の形式を開くこともでき、おそらくファイル名を無視し、ファイル自体のみを調べます。

于 2011-10-09T13:28:39.107 に答える