たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

Windowsで圧縮した巨大zipがPythonで展開/解凍できない!

結論

それはライセンス関係で解凍できない。Pythonのzipfileで圧縮しなおせばok

現象

こんなエラーが発生した。

raise NotImplementedError("compression type %d (%s)" % (compress_type, descr))
NotImplementedError: compression type 9 (deflate64)

zipが解凍できないとは何事だ…?
別のzipは解凍できるのに、1.6GBあるファイルは解凍できない、なぜだ。

deflate64の闇

このissueに全てが書いてある.
github.com
要するに、この圧縮方式 (type 9, deflate64) はプロプライエタリな圧縮方式であり、python公式モジュールは意図的に対応していない。
そしてWindowsでは大容量ファイルの圧縮にdeflate64を利用するらしい。
すなわち、Windowsで圧縮した巨大zipファイルはPython非対応圧縮方式なためにPythonで解凍できない。omg...

解決方法

一度Windowsで解凍し、Pythonのライブラリを使ってzipにし直す。

1. モジュールを直接呼び出す

Pythonコマンドラインの-mを利用して、ライブラリを直接利用できる。なので

python -m zipfile -c "new_zip_name.zip" source_dir_path

を叩けばおk
ただし、ディレクトリごと圧縮されるので、zipファイル内にsource_dir_pathディレクトリが1階層挟まることにはなる

2. ziplib

1.のディレクトリ挟まる現象を避けたい場合は、zipfileを使って圧縮し直す。
コマンドラインからPython REPL起動して以下を実行すればいい

import zipfile
zip = zipfile.ZipFile("new_zip_name.zip", mode="a", compression=zipfile.ZIP_DEFLATED)
 
for f in files:
    zip.write(f)