Я попробовал это, и могу воспроизвести это. Метод извлечения всех, как предлагают другие ответы, не решает проблему. Мне кажется, что это ошибка в модуле zipfile (возможно, только для Windows?), Если только я не понимаю, как структурированы zip-файлы.
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
; если это каталог, создайте каталог. В противном случае распакуйте файл.