【Python】ファイルをZIPに圧縮・解凍(展開)する方法:zipfileモジュール

2023.01.22 /

【Python】ファイルをZIPに圧縮・解凍(展開)する方法:zipfileモジュール

記事ではPythonによる、ファイルをZIPに圧縮・解凍(展開)する方法について解説していきます。ここではZIPファイルの操作にzipfileモジュールを使用します。

ZIPファイルは複数のファイルを1つにまとめ、サイズも小さくできる便利なアーカイブファイルです。ビジネスでもインターネットを介してのファイルのやり取りで頻繁に利用されています。

PythonでZIPファイルの作成や展開ができるようになると、仕事で利用するアプリケーションの作成に役立ちます。

本記事を通して、zipfileモジュールによるZIPファイルの圧縮・解凍について理解を深めてください。

ZIPファイル

ZIPファイルとは

ZIPファイルとは拡張子がzipである、複数のファイルやフォルダを1つのファイルにまとめた(圧縮した)ファイルです。

IT用語の確認

ZIPファイルのような、複数のファイルをひとつにまとめたファイルをアーカイブファイルファイルと呼びます

ZIPファイルを利用することで複数のファイルを1つにまとめることができ、ファイルサイズもデータ圧縮して小さくできます。

例えば多くのファイルをお客様に送るときや、ファイルサイズが大きなファイル群を送る際に活躍します。受け取り側の負担を減らすためにもZIPで圧縮してファイルのやり取りをするシーンはビジネスでは多いです。

データ圧縮の種類はZIPだけでなく、rarやtar、7zなど数多くあります。その中でもzipを利用する人が多い印象を持ちます。

PythonでZIPファイルを扱う方法

PythonでZIPファイルを扱うにはzipfileモジュールを使用します。zipfileモジュールはPythonの標準ライブラリの一つです。

zipfileモジュールを使うことで、ZIPファイルの作成や展開ができます。zipfileモジュールを利用したZIPファイルの作成、展開については次項より詳しく解説していきます。

Python:zipfileモジュールの使い方

zipfileモジュールをインポートする

Pythonでzipfileモジュールを使用する場合、プログラムの先頭でzipfileモジュールをインポートします。

>>> import zipfile

これによりzipfileモジュールの関数を利用できるようになります。

ZipFileオブジェクトの生成

ZIPファイルの読み込みや、作成、展開はZipFileオブジェクトを通して行います。ZipFileオブジェクトとは辞書やリストと同様のデータ型であり、プログラムでZIPファイルの操作を行うためのオブジェクトです。

ZipFileオブジェクトの生成にはzipfileモジュールのZipFile()関数を使用します。ZipFile()関数の引数になにを指定するかによって、ZIPファイルの作成や追加、展開などをコントロールします。

実際のどのようにZipFileオブジェクトを生成していくのかは次項以降をご確認ください。

ZIPファイルを作成:ファイルの圧縮

新たにZIPファイルを作成する(ファイルを圧縮する)には、ZipFile()関数の第一引数にファイル名、第二引数に書き込みモードを表す「w」を指定してZipFileオブジェクトを生成します。

構文

zipfile.ZipFile(作成するファイル名, "w")

>>> import zipfile
>>> zip_file = zipfile.ZipFile("new.zip", "w")

生成したZipFileオブジェクトにwrite()メソッドでファイルのパスを渡すと、そのファイルをZIPファイルに追加します。

write()メソッドでは第一引数にファイルのパス、第二引数には圧縮形式を指定します。

構文

ZipFileオブジェクト.write(ファイルパス, compress_type=圧縮形式)

>>> import zipfile
>>> zip_file = zipfile.ZipFile("new.zip", "w")
>>> zip_file.write("test1.pdf", compress_type=zipfile.ZIP_DEFLATED)
>>> zip_file.write("test2.pdf", compress_type=zipfile.ZIP_DEFLATED)
>>> zip_file.close()

上記コードでは圧縮形式に「zipfile.ZIP_DEFLATED」を指定しており、通常はこの圧縮形式を指定します。

注意

圧縮形式を指定しない場合は、ファイルの圧縮はせずにファイルを1つにまとめるだけになります

圧縮形式を指定しない場合は、ファイルの圧縮はせずにファイルを1つにまとめるだけになります

圧縮形式 説明
zipfile.ZIP_STORED 圧縮はせずにファイルをまとめる(デフォルト)
zipfile.ZIP_DEFLATED 一般的なZIPの圧縮形式
zipfile.ZIP_BZIP2 BZIP2形式での圧縮
zipfile.ZIP_LZMA LZMA形式での圧縮

BZIP2やLZMAはZIP_DEFLATEDよりも小さいサイズに圧縮できますが、その分時間がかかります。

ZIPファイルにファイルを追加する

既存のZIPファイルにファイルを追加する場合、ZipFile()関数の第一引数にZIPファイル名、第二引数に追加モードを表す「a」を指定してZipFileオブジェクトを生成します。

構文

zipfile.ZipFile(既存のZIPファイル名, "a")

>>> import zipfile
>>> zip_file = zipfile.ZipFile("exist.zip", "a")

追加モードでZipFileオブジェクトを生成したあとは、write()メソッドでファイルを追加していきます。

ZIPファイルを読み込む

ZIPファイルを読み込み、ZIPファイルにまとめられているファイル名やそれぞれのサイズなどを確認することができます。

まずZipFile()関数に調べたいZIPファイルを指定し、ZipFileオブジェクトを生成します。

>>> import zipfile
>>> zip_file = zipfile.ZipFile("exist.zip", "w")

ZIPファイルにまとめられているファイル、フォルダを確認するにはnamelist()メソッドを使用します。namelist()メソッドはZIPファイル内のファイル名、フォルダ名をリストで返します。

>>> zip_file.namelist()
['test1.pdf', 'test2.pdf',]

ZIPファイル内のファイルサイズを知りたい場合、ZipFileオブジェクトに対してgetinfo()メソッドを使用してZipInfoオブジェクトを生成します。getinfo()にはnamelist()で確認したファイル名を渡します。

>>> import zipfile
>>> zip_file = zipfile.ZipFile("exist.zip", "w")
>>> zip_names = zip_file.namelist()
>>> zip_file_info = zip_file.getinfo(zip_names[0])

対象のファイルの元のファイルサイズはfile_size属性、圧縮後のファイルサイズはcompress_size属性を確認することで知ることができます。

>>> zip_file_info.file_size
338422
>>> zip_file_info.compress_size
329159

元のファイルサイズを圧縮後のファイルサイズで割ることによって、圧縮率を求めることができます。

>>> zip_file_info.file_size / zip_file_info.compress_size
1.0281414149392847

ZIPファイルを開く(展開・解凍する)

ZIPファイルを開く(展開・解凍する)にはZipFileオブジェクトにextractall()メソッドを使用します。

>>> import zipfile
>>> zip_file = zipfile.ZipFile("exist.zip")
>>> zip_file.extractall()

上記コードではカレントディレクトリにZIPファイルのファイル、フォルダを展開しています。extractall()メソッドに展開先のパスを渡すことで、ZIPファイルの展開先を指定することができます。

extractall()メソッドはZIPファイルの中身すべてを解凍します。あまり使う機会はないと思いますがextract()メソッドで特定のファイルのみを解凍して取り出すことができます。

extract()メソッドの第一引数にはZIPファイル内にあるファイル名、第二引数に解答先のパスを指定できます。