これを試してみて、再現できます。他の回答で示唆されているように、extractallメソッドは問題を解決しません。これは、zipファイルがどのように構造化されているかを誤解していない限り、私にはzipfileモジュールのバグのように見えます(おそらくWindowsのみですか?)。
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
; ディレクトリの場合は、ディレクトリを作成します。それ以外の場合は、ファイルを抽出します。