スライドショー

これで解決!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構文を使ってファイルを簡単に扱おう
更新日 : 2019年3月30日

ここで圧縮されていない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

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

ryo

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説