Я попробовал это и могу воспроизвести. Метод Extractall, предложенный другими ответами, не решает проблему. Мне это кажется ошибкой в модуле 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
; если это каталог, создайте каталог. В противном случае извлеките файл.
person
DNS
schedule
12.03.2009