我试过了,可以重现它。正如其他答案所建议的, extractall 方法不能解决问题。对我来说,这似乎是 zipfile 模块中的一个错误(可能仅限 Windows?),除非我误解了 zipfile 的结构。
testa\
testa\testb\
testa\testb\test.log
> test.zip
>>> from zipfile import ZipFile
>>> zipTest = ZipFile("C:\\...\\test.zip")
>>> zipTest.extractall("C:\\...\\")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "...\zipfile.py", line 940, in extractall
File "...\zipfile.py", line 928, in extract
File "...\zipfile.py", line 965, in _extract_member
IOError: [Errno 2] No such file or directory: 'C:\\...\\testa\\testb\\test.log'
如果我执行printdir(),我会得到这个(第一列):
>>> zipTest.printdir()
File Name
testa/testb/
testa/testb/test.log
如果我尝试只提取第一个条目,如下所示:
>>> zipTest.extract("testa/testb/")
'C:\\...\\testa\\testb'
在磁盘上,这会创建一个文件夹testa,其中包含一个文件 testb。这显然是后续尝试提取test.log 失败的原因; testa\testb 是文件,不是文件夹。
编辑#1:如果你只提取文件,那么它可以工作:
>>> zipTest.extract("testa/testb/test.log")
'C:\\...\\testa\\testb\\test.log'
编辑#2:杰夫的代码是要走的路;遍历namelist;如果是目录,则创建目录。否则,解压文件。