4

Python で奇妙なエラーが発生します。zip モジュールを使用してパスワードで保護されたファイルを抽出しようとすると、「oy」をパスワードとして設定しようとすると例外が発生します。他のすべてはうまくいくようです。ZipFile モジュールのバグ?

import zipfile    
zip = zipfile.ZipFile("file.zip", "r")
zip.setpassword("oy".encode('utf-8'))
zip.extractall() #Above password "oy" generates the error here
zip.close()

これは私が得る例外です:

Traceback (most recent call last):
  File "unzip.py", line 4, in <module>
    zip.extractall()
  File "C:\Program Files\Python32\lib\zipfile.py", line 1002, in extrac
l
    self.extract(zipinfo, path, pwd)
  File "C:\Program Files\Python32\lib\zipfile.py", line 990, in extract
    return self._extract_member(member, path, pwd)
  File "C:\Program Files\Python32\lib\zipfile.py", line 1035, in _extra
member
    shutil.copyfileobj(source, target)
  File "C:\Program Files\Python32\lib\shutil.py", line 65, in copyfileo
    buf = fsrc.read(length)
  File "C:\Program Files\Python32\lib\zipfile.py", line 581, in read
    data = self.read1(n - len(buf))
  File "C:\Program Files\Python32\lib\zipfile.py", line 633, in read1
    max(n - len_readbuffer, self.MIN_READ_SIZE)
zlib.error: Error -3 while decompressing: invalid block type

エンコーディングとして UTF-16 を使用すると、次のエラーが発生します。

zlib.error: Error -3 while decompressing: invalid distance too far back

編集 次のものを使用して仮想Linuxマシンでテストしました:

  • Python バージョン: 2.6.5
  • パスワードで保護されたzipファイルを作成しましたzip -e file.zip hello.txt

今、問題は別のもののようです。パスワードが間違っていてもzipファイルを解凍できるようになりました!

try:
    zip.setpassword("ks")  # "ks" is wrong password but it still extracts the zip
    zip.extractall()
except RuntimeException:
    print "wrong!"

間違ったパスワードで zip ファイルを抽出できる場合があります。その後、ファイル (zip ファイル内) が抽出されますが、開こうとすると、情報が破損/復号化されているように見えます。

4

3 に答える 3

8

パスワードに問題がある場合、通常、次の例外が発生します。

RuntimeError: ('Bad password for file', <zipfile.ZipInfo object at 0xb76dec2c>)

あなたの例外はブロック タイプに関するものなので、.zip アーカイブが破損している可能性があります。スタンドアロンの unzip ユーティリティで解凍しようとしましたか?

または、7zip などの変なものを使用して作成したため、互換性のない .zip アーカイブが作成された可能性があります。


十分な情報を提供していません (OS のバージョン? Python のバージョン? ZIP アーカイブの作成者とコンテンツ? これらのアーカイブには多くのファイルがありますか、それとも単一のアーカイブに単一のファイルがありますか? それらのすべてのファイルで同じエラーが発生しますか? またはそれらの一部を解凍できますか? )、ここに簡単な Q&A セクションがあります。問題を見つけて解決するのに役立ちます。

Q1. これは Python のバグですか?

A1. ありそうもない。

Q2. この動作の原因は何ですか?

A2. 壊れた zip ファイル、互換性のない zip コンプレッサー -- 何も言わないので、正確な原因を特定するのは困難です。

Q3. 原因を見つける方法は?

A3. 問題の切り分けを試み、エラーが発生したファイルを見つけ、zip.testzip()その特定のファイルを別の unzip ユーティリティで使用および/または解凍して、結果を共有してください。問題のあるファイルにアクセスできるのはあなただけなので、自分で何かをしようとしない限り、誰もあなたを助けることはできません

Q4. これを修正する方法は?

A4. それはいけません。別の zip エクストラクターを使用すると、機能しZipFileません。

于 2012-05-05T20:04:15.977 に答える
6

testzip()ファイルを抽出する前に、この方法を使用してファイルの整合性をチェックしてみてください。

于 2012-05-09T13:37:13.333 に答える
3

zipfileのバグ、またはzip実装のバグである可能性があります。私はあなたの行番号が私のものと一致しないことに気づいたので、これは私が持っている現在の3.2.3リリースよりも早いpython3.2だと思います。

さて、あなたのコードに関しては、Linux上のPython3.2.3で動作します。クラッシュの修正を含む、zipfileとzlibに関連するバグ修正が多数あるように思われるため、最新の3.2.xに更新することをお勧めします。

于 2012-05-09T19:35:21.203 に答える