Pythonでzipfileを使用して構築したアーカイブに問題があります。ディレクトリ内のすべてのファイルを繰り返し処理して、アーカイブに書き込んでいます。後でそれらを抽出しようとすると、パス区切り文字に関連する例外が発生します。
the_path= "C:\\path\\to\\folder"
zipped= cStringIO.StringIO()
zf = zipfile.ZipFile(zipped_cache, "w", zipfile.ZIP_DEFLATED)
for dirname, subdirs, files in os.walk(the_path) :
for filename in files:
zf.write(os.path.join(dirname, filename), os.path.join(dirname[1+len(the_path):], filename))
zf.extractall("C:\\destination\\path")
zf.close()
zipped_cache.close()
例外は次のとおりです。
zipfile.BadZipfile:ディレクトリ "env\index"とヘッダー"env/index"のファイル名が異なります。
更新:文字列バッファcStringIO.StringIO()を一時ファイル(tempfile.mkstemp("temp.zip"))に置き換えましたが、動作するようになりました。zipfileモジュールがアーカイブを破壊するバッファに書き込むときに何かが起こりますが、問題が何であるかはわかりません。
問題は、「rb」/「wb」ではなく「r」/「w」モードで開いているファイルとの間で情報の読み取り/書き込みを行っていたことでした。これはLinuxでは問題になりませんが、Windowsでは文字エンコードが原因でエラーが発生しました。解決しました。