11

アーカイブをテストするために、Pythonの標準ライブラリであるzipfileを使用しています。

zf = zipfile.ZipFile(archive_name)
if zf.testzip()==None: checksum_OK=True

そして、私はこのランタイム例外を取得しています:

File "./packaging.py", line 36, in test_wgt
    if zf.testzip()==None: checksum_OK=True
  File "/usr/lib/python2.7/zipfile.py", line 844, in testzip
    f = self.open(zinfo.filename, "r")
  File "/usr/lib/python2.7/zipfile.py", line 915, in open
    "password required for extraction" % name
RuntimeError: File xxxxx/xxxxxxxx.xxx is encrypted, password required for extraction

testzip()を実行する前に、zipが暗号化されているかどうかをテストするにはどうすればよいですか?この仕事を簡単にするようなキャッチの例外は見つかりませんでした。

4

2 に答える 2

14

zipfile.pyライブラリコードをひと目見ると、ZipInfoクラスのflag_bitsプロパティをチェックして、次のようにファイルが暗号化されているかどうかを確認できることがわかります。

zf = zipfile.ZipFile(archive_name)
for zinfo in zf.infolist():
    is_encrypted = zinfo.flag_bits & 0x1 
    if is_encrypted:
        print '%s is encrypted!' % zinfo.filename

0x1ビットが設定されているかどうかを確認するのは、zipfile.pyソースがファイルが暗号化されているかどうかを確認する方法です(より適切に文書化できます)。実行できる1つの方法は、testzip()からRuntimeErrorをキャッチし、infolist()をループしてzipに暗号化されたファイルがあるかどうかを確認します。

次のようなこともできます。

try:
    zf.testzip()
except RuntimeError as e:
    if 'encrypted' in str(e):
        print 'Golly, this zip has encrypted files! Try again with a password!'
    else:
        # RuntimeError for other reasons....
于 2012-08-20T13:36:18.563 に答える
0

例外をキャッチしたい場合は、次のように記述できます。

zf = zipfile.ZipFile(archive_name)
try:
    if zf.testzip() == None:
        checksum_OK = True
except RuntimeError:
    pass
于 2012-08-20T13:29:27.567 に答える