これで解決!Pythonでzipファイルを圧縮・解凍する方法

Pythonではzipモジュールを使用して、簡単にファイルをzip形式に圧縮・解凍することができます。

プログラミングではファイルサイズの大きいデータを扱う場面がよくあります。

そしてその大きなデータを小さくする方法として、ファイルを圧縮してzipファイルにするという方法があります。

「ファイルをzip形式に圧縮方法が知りたい」
「zip形式のファイルを解凍する方法が知りたい」

そこで、今回はzip形式のファイルを扱う方法として、以下の内容を解説していきます。

・zipファイルとは
・zipfileモジュールでアーカイブ、圧縮、解凍をする方法

zipfileモジュールを正しい場面で使いこなせるようにしっかりと学習していきましょう!

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文は、クローズ処理を省略することが出来る便利な構文です。

詳しくはこちらの記事で解説されているのでぜひご覧ください。

【Python入門】with構文を使ってファイルを簡単に扱おう
更新日 : 2020年5月8日

ここで圧縮されていない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ファイルの取り扱いについて忘れてしまったら、ぜひこの記事を読み返してみてください!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

侍テック編集部

侍テック編集部