Pythonではzipモジュールを使用して、簡単にファイルをzip形式に圧縮・解凍することができます。
プログラミングではファイルサイズの大きいデータを扱う場面がよくあります。
そしてその大きなデータを小さくする方法として、ファイルを圧縮してzipファイルにするという方法があります。
「zip形式のファイルを解凍する方法が知りたい」
そこで、今回はzip形式のファイルを扱う方法として、以下の内容を解説していきます。
・zipfileモジュールでアーカイブ、圧縮、解凍をする方法
zipfileモジュールを正しい場面で使いこなせるようにしっかりと学習していきましょう!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
zipファイルとは
まずはzipファイルや、圧縮、解凍とはどのような作業かについて知っておきましょう。
サイズの大きいファイルをメールなどで渡すとき、サイズが大きければ送信に時間がかかってしまいます。
そこでファイルのサイズを小さくするために圧縮という作業を行って、ファイルサイズの小さい一つのファイルに仕上げます。
そして、その圧縮されたファイルがzipファイルと呼ばれます。
WindowsでもMacでも、このようにジッパーのついたアイコンが特徴的です。
zipファイルは一番良く使われている圧縮形式です。
ファイルをzip形式で圧縮したり、zipファイルで渡されたファイルを見るためには、プログラム側で圧縮・解凍という作業をします。
これらが今回の記事で前提になる知識になります。
zipfileモジュールの使い方
ここからは早速、Pythonからzipファイルを扱っていきましょう。
Pythonではzipfileモジュールを使うことで簡単にzipファイルを扱うことが出来ます。
ちなみに今回想定する画像ファイルの名前は、
・pyziptest_1.jpg
・pyziptest_2.jpg
・pyziptest_3.jpg
・pyziptest_4.jpg
という連番になっていて、それぞれはpyziptestという名前のディレクトリに入っています。
4つの画像に加えて、画像についての説明が書かれたdescription.txtもpyziptestというディレクトリに入っていることを想定しています。
zipfileモジュールでファイルをアーカイブする方法
まずはアーカイブという作業をします。
アーカイブとは、複数のファイルを1つにまとめる作業のことで、圧縮とは違うものになります。
言い換えてみれば、フォルダ(ディレクトリ)を作ってひとまとめにするような意味になります。
サンプルコードを見てみましょう。
import zipfile compFile = zipfile.ZipFile('./photos.zip', 'w', zipfile.ZIP_STORED) compFile.write('./pyziptest_1.jpg') compFile.write('./pyziptest_2.jpg') compFile.write('./pyziptest_3.jpg') compFile.write('./pyziptest_4.jpg') compFile.write('./description.txt') compFile.close()
ここではphotos.zipという圧縮される前のzipファイルを作りました。
まずはzipfileモジュールをimportして、zipファイルを手軽に扱えるようにします。
zipfileのZipFileオブジェクトでは、第一引数にはアーカイブするファイル名のパス、第二引数に新しくアーカイブファイルへファイルを格納することを指定し、第三引数で’ZIP_STORED’(圧縮せずにアーカイブする)を指定しています。
その後、writeメソッドを使ってアーカイブする4つのファイルを指定し、最後にclose()メソッドを呼び出してアーカイブ処理を終わらせています。
ちなみに、すでに存在するアーカイブファイルに追加でファイルをアーカイブする場合は、第二引数は‘a’(追記モード)を指定しましょう。
zipfileモジュールでファイルを圧縮する方法
先程作ったphotos.zipは圧縮せずにアーカイブされた状態です。
ここからは実際にファイルを圧縮してみましょう。
こちらのサンプルコードを見てみましょう。
import zipfile compFile = zipfile.ZipFile('./zippedPhotos.zip', 'w', zipfile.ZIP_DEFLATED) compFile.write('./photos.zip') compFile.close()
photos.zipというファイルを、アーカイブを作るときと同じように読み込んでいます。
このサンプルコードではzippedPhotos.zipという、ファイルが出来ます。
アーカイブ処理との大きな違いは、第三引数の指定が‘ZIP_DEFLATED’(圧縮する)となっていることです。
もしアーカイブと圧縮を同時に行いたい場合は、アーカイブを作る時点で第三引数に’ZIP_DEFLATED’を指定し、4つのファイルをそれぞれwriteメソッドの引数に指定することで省略できます。
zipfileモジュールでファイルを解凍する方法
次にzipファイルを解凍する方法について解説します。
このサンプルコードを見てみましょう。
import zipfile with zipfile.ZipFile('zippedPhotos.zip','r') as inputFile: inputFile.extractall()
このサンプルコードを実行すると、カレントディレクトリ(サンプルコードが配置されているディレクトリ)にzippedPhotos.zipというフォルダとその配下に格納されているファイルが解凍されます。
解凍先を変更したい場合はextractallメソッドの引数に解凍先ディレクトリのパスを指定します。
ここで使われているwith文は、クローズ処理を省略することが出来る便利な構文です。
詳しくはこちらの記事で解説されているのでぜひご覧ください。
ここで圧縮されていないpyziptestと、圧縮されたzippedPhotos.zipの容量を比べてみました。
こちらが圧縮されていないpyziptestのサイズです。
$ du -h pyziptest 304K pyziptest
304キロバイトと表示されました。
そして次に圧縮されたzippedPhotos.zipのサイズを見てみましょう。
$ du -h zippedPhotos.zip 240K pyziptest.zip
見事に容量が削減されましたね。
しかし、PNG形式やJPG形式ではすでにある程度圧縮がされているので、zipで圧縮する効果はあまりありません。
Pythonのコードなど圧縮がされていない情報ではとても大きな効果を発揮します。
まとめ
この記事ではzipファイルの取り扱いについて、基本的な使い方を解説してきました。
- zipファイルとは
- zipfileモジュールでアーカイブ、圧縮、解凍をする方法
zipファイルはzipfileモジュールを使うと、とても手軽に扱うことが出来ます。
そしてアーカイブや圧縮、解凍はZipFileメソッドの引数で指定することが出来ます。
もしzipファイルの取り扱いについて忘れてしまったら、ぜひこの記事を読み返してみてください!