Pythonを使ってZIPファイルを解凍する
ZIPファイルの解凍作業は面倒くさいです。なのでPythonを使ってZIPファイルを解凍しましょう。動作環境はPython3.6以上推奨。標準ライブラリだけでやっていきます。
1つのZIPファイルを解凍
フォルダ内のZIPファイルをまとめて解凍
階層構造が複雑なフォルダのZIPを解凍
1つのZIPファイルを解凍
os、zipfileを使います。最も基本的な処理なので、2・3の操作でもこれを使いまわしていきます。わからなければここに立ち返りましょう。
import os import zipfile with zipfile.ZipFile('sample.zip', 'r') as zf: for f in zf.namelist(): if not os.path.basename(f): os.mkdir(f) else: with open(f, 'wb') as uzf: uzf.write(zf.read(f))
複数ファイルを圧縮したZIPの場合を考慮し、os.path.basenameを使って条件分岐をかけています。これが基本。
フォルダ内のZIPファイルをまとめて解凍
globを使ってzipファイルを探し、個々に解凍処理を行います。上でやった処理にforをかけて回す感じです。
import os import zipfile import glob for i in glob.glob('*.zip'): with zipfile.ZipFile('i', 'r') as zf: for f in zf.namelist(): if not os.path.basename(f): os.mkdir(f) else: with open(f, 'wb') as uzf: uzf.write(zf.read(f))
これで作業ディレクトリ上に解凍されたファイルが生成されます。
階層構造が複雑なフォルダのZIPを解凍
これは以下のような状況で使います。稀に良くあります。
globを使ってzipファイルを探しに行きますが、今回は再帰的にディレクトリを深掘りしていくように指定します。
import os import zipfile import glob for i in glob.glob('**\*.zip', recursive=True): with zipfile.ZipFile('i', 'r') as zf: for f in zf.namelist(): if not os.path.basename(f): os.mkdir(f) else: with open(f, 'wb') as uzf: uzf.write(zf.read(f))
この処理だと作業ディレクトリに解凍ファイルが作成されます。各々のディレクトリ下に解凍ファイルを置きたい場合には、os.path.splitを使うと良いでしょう。
import os import zipfile import glob for i in glob.glob('**\*.zip', recursive=True): with zipfile.ZipFile('i', 'r') as zf: for f in zf.namelist(): d = os.path.split(i)[0] + '\\' + f if not os.path.basename(f): os.mkdir(d) else: with open(d, 'wb') as uzf: uzf.write(zf.read(f))
os.path.splitはなかなか便利なモジュールで、ファイルパスを食わせるとディレクトリ部分とファイル名に切り分けてくれます。
第一引数からディレクトリパスを持ってきて、そこに解凍後のファイル名を繋げています。
これで単純作業が減らせますね。