Pythonを使ってZIPファイルを解凍する

ZIPファイルの解凍作業は面倒くさいです。なのでPythonを使ってZIPファイルを解凍しましょう。動作環境はPython3.6以上推奨。標準ライブラリだけでやっていきます。

  1. 1つのZIPファイルを解凍

  2. フォルダ内のZIPファイルをまとめて解凍

  3. 階層構造が複雑なフォルダの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を解凍

これは以下のような状況で使います。稀に良くあります。

f:id:kazutaka83:20170908203313p:plain

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はなかなか便利なモジュールで、ファイルパスを食わせるとディレクトリ部分とファイル名に切り分けてくれます。

第一引数からディレクトリパスを持ってきて、そこに解凍後のファイル名を繋げています。

これで単純作業が減らせますね。

参考

Python で zip ファイルの解凍 - へたれプログラマな日々


スポンサード リンク