昨今、ZIPファイルの圧縮解凍はOSの標準機能に搭載されるようになった。そのため、複数ファイルを先方に送りたい場合、ZIP圧縮して送信することも多いだろう。そして、送信相手が複数いる場合、手作業で圧縮するのは面倒な作業となる。Pythonで自動化してみよう。

  • 100個のフォルダを連続でZIP圧縮しよう

    100個のフォルダを連続でZIP圧縮しよう

PythonでZIP圧縮するには?

ちなみに、Pythonにはzipという関数があるが、実はこの関数は、ZIP圧縮と全く関係ない。Pythonのzip関数は異なるリストを1つに交互に結合するのに使う。それでは、Pythonでフォルダを圧縮するにはどうしたら良いだろうか。

結論から言うと、PythonでZIP圧縮するには、shutil.make_archive関数を使う。他にも、ZIPファイルを操作するのにzipfileモジュールを使うこともできるが、今回は、shutil.make_archive関数を使ってみよう。この関数は次のように利用できる。

# フォルダを圧縮する方法
import shutil
shutil.make_archive(
    'ZIPファイルの名前', 
    format='zip',
    root_dir='圧縮したいフォルダ')

詳しう見てみよう。第一引数には、ZIPファイルのファイル名を指定する。この部分に拡張子を書く必要はなく、自動で「.zip」が付与される。そして名前付き引数のformatに'zip'を与えればZIP形式で圧縮される。ほかに「tar」「gztar」「bztar」「xztar」などが指定できる。次のroot_dirには圧縮したいフォルダを指定する。

このように、とても簡単にZIP圧縮が使える。もともと、shutilモジュールには、高水準のファイル操作を行うための便利なメソッドが用意されているが、このmake_archive関数もフォルダ内のファイルを一気に圧縮できるのでとても便利だ。

100個のフォルダを一気に圧縮しよう

それでは、ZIP圧縮の方法がわかったので、100個のフォルダを一気に圧縮してみよう。ここでは、targetというフォルダ以下に100個のフォルダが存在すると仮定しよう。

  • 100個のフォルダがあり、全部を圧縮したい

    100個のフォルダがあり、全部を圧縮したい

このフォルダを全部1つずつ圧縮するPythonのプログラムが以下だ。例えフォルダが何百個あろうが以下の5行のプログラムで一気に個別圧縮できる。「make100zip.py」という名前で保存しよう。

import shutil, glob, os  # (*1) 各種関数を使うのに必要な宣言
target_dir = './target/*'  # (*2) どのフォルダを圧縮するかを指定
for f in glob.glob(target_dir): # (*3) 指定フォルダ以下を繰り返す
     if not os.path.isdir(f): continue # (*4) フォルダだけを圧縮するよう除外
     shutil.make_archive(f, format='zip', root_dir=f) # (*5) 圧縮

プログラムを実行するには、Pythonに付属のIDLEで上記のプログラムを読み込んで実行するか、コマンドラインで以下のコマンドを実行しよう。

python3 make100zip.py

すると、次のように100個のフォルダが圧縮されて、100個のZIPファイルが生成される。

  • 100個のZIPファイルが生成されたところ

プログラムを確認してみよう。(*1)では圧縮やフォルダの列挙などに使うモジュールを宣言する。(*2)ではどのフォルダ以下を圧縮するのかフォルダのパスを指定しよう。(*3)では、glob.glob関数を使って、フォルダ一覧を列挙する。(*4)では列挙したのがフォルダとは限らないので、フォルダ以外であれば次の繰り返しに移るように指定する。(*5)ではフォルダを圧縮する。

ところで、今回のプログラムも前回と同様にChromebook上で作成した。今や、Windows/macOS/Chromebookとデスクトップ用途で使われるPCでは、手軽にLinuxが動くので、一度よく使うプログラム集を用意しておけば、どのOSでも同じようにプログラムを実行できるのが良いところだ。

もちろん、もともとPythonはマルチプラットフォーム上で同じように動くので、どのOSでもほとんど変更なしにプログラムを動かせるというのも大きい。

まとめ

以上、今回はフォルダを連続でZIP圧縮する方法を紹介した。基本的に関数を1つ書けば圧縮できるので便利だ。しかも、今回見たようにファイル一覧を列挙したあとで、フォルダだけ処理するなど条件で絞り込むこともできる。複数ファイルをまとめておきたい場合、バックアップしておきたい場合など、さまざまな用途で使えるZIP圧縮を、ぜひPython自動処理で活用しよう。

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