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 源如何查看文件是否已加密(可以更好地记录!)您可以做的一件事是从 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 回答