
[Python] 簡単にファイルを圧縮!zipfileモジュールで複数ファイルをZIPファイルにまとめる方法
はじめに
この記事では、Pythonのzipfileモジュールを使って複数のファイルをZIP圧縮する実装を行います。
例として、指定したフォルダ(ディレクトリ)にある、複数のCSVファイルを一つのZIPファイルにまとめます。

使用するライブラリ
zipfile
ZIPファイルの読み書きを行うための標準ライブラリです。
pathlib
ファイルやフォルダ(ディレクトリ)のパスをオブジェクトとして操作することができるライブラリです。
動作環境
windows11
Python 3.11.5
実装
以下にコード全体を示します。
import sys
import zipfile
from pathlib import Path
def zip_folder(folder_path, zip_file_name):
"""
指定フォルダ配下のファイルを圧縮する
args:
folder_path: 圧縮対象のフォルダパス
zip_file_name: 圧縮後のファイル名
return:
None
"""
folder_path = Path(folder_path)
with zipfile.ZipFile(zip_file_name, 'w') as zipf:
for file_path in folder_path.iterdir():
if file_path.is_file():
zipf.write(file_path, arcname=file_path.name)
return
if __name__ == '__main__':
folder_path = sys.argv[1]
zip_file_name = sys.argv[2]
zip_folder(folder_path, zip_file_name)
コードの説明
zipfile.ZipFile() メソッドで、ZIPファイルを作成します。
第一引数には、作成するZIPファイル名を指定します。
第二引数には、ZIPファイルのモードを指定します。今回は書き込みのため、'w' を指定します。
folder_path.iterdir()メソッドで、指定したディレクトリ内のディレクトリ、ファイル一覧を取得します。
file_path.is_file()メソッドで、ファイルかどうかを確認し、ファイルの場合のみ、ZIPファイルに追加する処理を行います。
zipf.write()メソッドで、ZIPファイルにファイルを追加します。
第一引数には、追加するファイルのパスを指定します。
arcname 引数には、ZIPファイル内のファイル名を指定します。
実行結果
圧縮ファイル(ファイル名:normal_zip.zip)が作成できました。

しかし、今回圧縮対象となったファイルサイズの合計と、作成したnormal_zip.zipのファイルサイズが同じでした。

想定では、ファイルサイズが圧縮されて、小さくなると思っていました。
公式ドキュメントを読んでみます。
注釈
ZipInfo インスタンスを引数 zinfo_or_arcname として与えた場合、与えられた ZipInfo インスタンスのメンバーである compress_type で指定された圧縮方法が使われます。デフォルトでは、ZipInfo コンストラクターが、このメンバーを ZIP_STORED に設定します。
圧縮方式のデフォルトは、圧縮せず複数ファイルをまとめるだけ(zipfile.ZIP_STORED)との記載がありました。
通常のZIP圧縮にするには、圧縮方式を設定する必要があります。
修正した実装
修正したのは、zipf.writeメソッドの引数部分です。
zipf.write(file_path, arcname=file_path.name, compress_type=zipfile.ZIP_DEFLATED)
compress_type引数には、zipfile.ZIP_DEFLATEDを設定しました。
これにより、ZIPファイル内のファイルは、圧縮されて格納されます。
実行結果
圧縮ファイル(ファイル名:compress_type_zip.zip)が作成できました。
ファイルサイズも圧縮されています!

まとめ
今回は、Pythonのzipfileモジュールを使って、複数のファイルを圧縮する方法について解説しました。
zipfileモジュールは、ZIPファイルの読み書きを行うための便利なモジュールです。
今回の記事を参考にして、zipfileモジュールを使ってみてください。