2012-05-05 62 views
4

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

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 

EDIT 次のものを持つ仮想Linuxマシン:

  • Pythonのバージョン:2.6.5
  • 私は今では問題は何か他のものであるようだzip -e file.zip hello.txt

でパスワード保護されたzipファイルを作成しました。パスワードが間違っていてもzipファイルを解凍できるようになりました!

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

誤ったパスワードでzipファイルを抽出することがあります。ファイル(zipファイル内)が抽出されますが、開こうとすると情報が破損/復号化されたようです。

+3

「ZipFile」はコンテキストマネージャなので、[with with文](http://docs.python.org/reference/compound_stmts.html#with)を使用することができますファイル。より読みやすく、例外が発生した場合でも正しく処理されます。 –

+0

異なるエンコーディングを試しましたか? utf16? – User

+0

@ user1320237:はい、あります。同じ問題。しかし、それはうまく動作しない他のパスワードです。 – Rox

答えて

8

パスワードに問題がある場合、通常は次の例外を取得:あなたの例外はあなたの.zipファイルのアーカイブが破損しているおそらく、ブロックタイプ文句を言うので

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

を、あなたがそれを解凍しようとしていますスタンドアロンのunzipユーティリティ?

または、7zipのように、互換性のない.zipアーカイブを作成するような面白いものを使用したことがあります。


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

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

A1。おそらくありません。

Q2。この現象の原因は何ですか?

A2。壊れたzipファイル、互換性のないzip圧縮器 - 何も知らないので、正確な原因を指摘するのは難しいです。

Q3。原因を見つけるには?

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

Q4。これを修正するには?

A4。できません。別のジップ抽出器を使用すると、ZipFileは機能しません。

+0

zipファイルのパスワードが "hello"のようなものであれば動作します。それから私は上記のPythonコードで問題なく解凍できます。だからそれは別のものでなければならない。バグかもしれない? – Rox

+0

あなたがパスワードにASCII文字を使用している限り、 'encode( 'utf-8')'などを実行する必要はなく、同じASCII文字を返します。ところで、あなたはどんなソフトウェアを使って.zipファイルを作成するのですか? – lenik

+0

ファイルを作成したソフトウェアがわかりません。私は自分の仕事でそれらの束を持っているし、私も各zipファイルのすべてのパスワードのリストがあり、それらをすべて抽出するpythonスクリプトを作りたいと思います。しかし、上記のように、たとえASCIIまたはUTF-16でエンコードされていても、一部のパスワードは機能していないようです。 – Rox

5

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

+0

"なし"を返します。それはzipファイルが壊れていないことを意味しますか? – Rox

+0

はい。ファイルが破損している場合は、読み込めないファイルの名前が返されます。 unzipやwinzipのような別のunzipプログラムで問題のあるzipファイルを解凍しようとしますか?それがうまくいけば、Pythonのバグを疑うのは妥当でしょう。しかし、バグレポートを提出する前に最新バージョンのPythonにアップグレードしてください。 –

+0

さらに詳しく述べると、実際のエラーは(少なくともUNIX上では)システムの共有libzライブラリを使用する動的にロードされたzlibモジュールから発生します。これがバグであれば、それはいくつかの場所にある可能性があります。 –

3

おそらくzipファイルのバグ、またはあなたのzip実装のバグかもしれません。あなたの行番号は私のものと一致しないので、これは私が現在持っている3.2.3よりも前のPython 3.2だと思いました。

あなたのコードに関しては、Linux上のPython 3.2.3で私のために動作します。クラッシュの修正を含む、zipfileとzlibに関連したいくつかのバグ修正があるように、最新の3.2.xにアップデートすることをお勧めします。

+0

私は3.2と3.1で試しました。同じエラーと思われます。上記の投稿で私の編集を見てください。 – Rox

+0

いいえ、私は最新のpython 3.2をインストールすることを意味します、それは_3.2.3_です –

関連する問題