Pythonは標準でもかなり多くのライブラリを備えている。今回は標準ライブラリの中でも普段から使って便利な圧縮解凍パッケージのzipfileを使ってみよう。Pythonを使えばZIPファイルが100個あったとしても数行のプログラムを書くだけで全部解凍できる。

  • 100個のファイルを一気に解凍しよう

    100個のファイルを一気に解凍しよう

100個以上のZIPファイルがあったら根性で解凍する?

日々の業務で作成したデータをZIP圧縮して、USBメモリやHDDやSSDなどのストレージに保存している場面は意外と多いことだろう。とは言え、そのようにZIP圧縮して保存したデータをいざ全部解凍したいという事情ができた場合、どうしているだろうか。

「100個くらい根性で解凍」という方もいることだろう。ZIPファイルを一つ一つダブルクリックしていけば一応目的は達成できる。しかし、Pythonなら標準ライブラリのzipfileを利用してスマートにファイルを解凍できる。

ZIPファイルを解凍する方法

最初に、ZIPファイルを解凍する最も簡単な方法を確認してみよう。Pythonの標準パッケージであるzipfileを使えば、たった三行で解凍できる。

以下は「test.zip」というZIPファイルを解凍して「test」というフォルダ以下に展開する例だ。

import zipfile
with zipfile.ZipFile('test.zip', 'r')as f:
    f.extractall('./test')

上記のプログラムを「test-unzip.py」という名前で保存したら、Pythonの実行環境のIDLEを起動しよう。IDLEのメニュー[File > Open]でプログラムを読み込んで実行してみよう。うまく実行されると、testというフォルダ以下にZIPファイルの内容が解凍される。

  • test.zipをtestフォルダに解凍してみたところ

    test.zipをtestフォルダに解凍してみたところ

プログラムを確認しよう。1行目ではzipfileパッケージを使う事を宣言する。そして、2行目ではZIPファイル「test.zip」を読み込みモード"r"で開く。3行目ではextractallメソッドを使って「./test」というフォルダにファイルを解凍する。

便利なwith文の使い方を復習しよう

なお、上記のプログラムではwith文を使っている。これはファイルの読み書きでよく使う構文だ。プログラミングでファイルやデータベースの読み書きを行う時は、必ず以下の手順を踏む必要がある。

  • (1) ファイルを開く
  • (2) ファイルに対する読み書きを行う
  • (3) ファイルを閉じる

これに対して、with文を使って開いたファイルはそのブロックを出る時に自動的に閉じられる仕組みになっている。これによりうっかりファイルを閉じ忘れるのを防ぐことができる。

[書式]
with ファイルを開く処理 as 変数
  # ここでファイルを扱う処理

本題 - 100個のファイルを解凍しよう

それでは本題のプログラムを作ってみよう。以下のプログラムを実行する際は、100個のZIPファイルが入っているフォルダのパスと、解凍先のパスを指定しよう。

import zipfile, os, glob

# ZIPファイルのパスを指定 --- (*1)
zip_dir = '/path/to/zip'
# 解凍先のフォルダを指定 --- (*2)
script_dir = os.path.dirname(__file__)
out_dir = os.path.join(script_dir, 'output')

# ZIPファイルを列挙 --- (*3)
files = glob.glob(zip_dir+"/*.zip")
for f in files:
  print("unzip:", f)
  # 解凍先のフォルダを動的に決定 --- (*4)
  base = os.path.basename(f).replace(".zip", "")
  unzip_path = os.path.join(out_dir, base)
  # 解凍 --- (*5)
  with zipfile.ZipFile(f, 'r') as f:
     f.extractall(unzip_path)

同じように、PythonのIDLEでPythonファイルを読んで実行してみよう。正しくZIPファイルを列挙できるとIDLEの実行結果としてZIPファイル名が表示される。

  • プログラムを実行したところ

    プログラムを実行したところ

プログラムの(*1)には100個のZIPファイルが保存されているパスを指定しよう。そして、(*2)には解凍したファイルの保存先を指定しよう。

(*3)ではZIPファイルを列挙している。そしてfor文を使って全てのZIPファイルを処理する。(*4)では解凍先のフォルダ名を動的に決めている。ここではZIPファイルの名前の部分を採用することにした。(*5)では解凍処理を行う。

まとめ

今回は大量のZIPファイルを順番に解凍するプログラムを作ってみた。もちろん解凍ツールとバッチファイルを組み合わせることでも似たことはできる。しかし、解凍先のフォルダ名に規則を持たせたり、解凍しながら出力レポートを作ったりするなど、追加機能を加えたいときの使い勝手はPythonの方が上だ。また、前回紹介したPySimpleGUIと組み合わせれば、使い勝手の良い汎用ツールを作ることもできるだろう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。