【Python】データを圧縮・解凍する方法【zipfileモジュール】

Python

この記事では、Pythonでデータ(ファイル)を圧縮・解凍する方法を解説します。データを圧縮することで容量の大きなデータを小さくしたり、複数のデータをまとめたりできます。

データ圧縮と解凍とは?

データ圧縮と解凍について解説します。

データ圧縮

データ圧縮とは、以下のようなものです。

データ圧縮(データあっしゅく)とは、あるデータをそのデータの実質的な性質(専門用語では「情報量」)を保ったまま、データ量を減らした別のデータに変換すること。

データ圧縮 – Wikipedia

つまりデータ圧縮とは、なにかしらのルールに則ってデータを書き換え、サイズを小さくすることを言います。

先ほど「なにかしらのルールに則ってデータを書き換える」と言いましたが、どのようなルールがあるのでしょうか?具体的な例を交えて見てきましょう!

ハフマン符号

ハフマン符号とは、JPEGやZIPなどの圧縮フォーマットとして使用されています。

符号化方法

  1. ファイルなどの固定長のデータを読み込み、全ての記号を調べて出現頻度を記録する
  2. 出現頻度が高い記号順に小さなデータで表現できるように対応表を作成する
  3. 作成した対応表通りにファイルを符号化する

もう少し具体的な例を見てみましょう!
以下のような記号があったとして、
※ データ量はその記号を表すのに使用するデータ量です。

記号ABCD
データ量1234

この記号から作成された以下のようなデータがあるとします。

BBCADADBDB

このデータのサイズは23になります。
では、出現頻度が高い順に小さなデータで表現できるように対応表を作成してみます。

記号個数データ量
B41
D32
A23
C14

この対応表通りに先ほどのデータのデータ量を計算すると20になります。このように、出現頻度が高い順に小さなデータで表現できるようにすることで、ファイルのサイズを小さくすることができます。

解凍

圧縮されたデータを元に戻すことを解凍といいます。

日本では1980年代にパソコン通信やファイル圧縮ソフトの付属文書などを通じて「解凍」という用語が広まった(対応して圧縮のことを凍結と呼ぶこともあったがこれは広まらなかった)ため、慣用的に解凍と呼ぶことが多いが、本来の語義として圧縮と解凍では意味が対応しておらず、解凍には容積の増減の意味はないことなどから批判も多い。

解凍(伸張)とは – IT用語辞典 e-Words

Pythonでのデータ圧縮・解凍方法

Pythonでデータを圧縮・解凍するには、zipfileモジュールを使うことで実装することができます。それでは、zipfileモジュールを使った圧縮・解凍方法を見ていきましょう!

圧縮

ZipFileオブジェクトを作成して、writeメソッドで圧縮するファイルを追加します。

import zipfile

with zipfile.ZipFile(ZIPファイル名, "w", 圧縮形式) as zf:
    zf.write(圧縮するファイル名, zipファイルの中でのファイル名)

第三引数では、以下の中から圧縮形式を指定できます。

  • zipfile.ZIP_STORED: 圧縮せず複数ファイルをまとめる(デフォルト)
  • zipfile.ZIP_DEFLATED: 一般的なZIP圧縮
  • zipfile.ZIP_BZIP2: BZIP2圧縮
  • zipfile.ZIP_LZMA: LZMA圧縮

writeメソッドの第三引数を指定することで、ファイル毎に圧縮形式を変更することができます。

zf.write(圧縮するファイル名, ZIPファイルの中でのファイル名, 圧縮形式)

サンプル

適当なファイルを圧縮してみましょう!

import zipfile

with zipfile.ZipFile('test.zip', 'w') as zf:
    zf.write('test1.txt', 'test1.txt', zipfile.ZIP_DEFLATED)
    zf.write('test2.txt', 'dir/test2.txt')

先ほどのコードを実行すると、以下のようなZIPファイルが生成されます。

展開して中身を確認してみましょう!

無事にtest.txtdir/test2.txtが確認できました!

解凍

解凍も圧縮と同じくZipFileオブジェクトを作成して、extractallメソッドでZIPファイルの中身をカレントディレクトリに全て解凍することができます。

with zipfile.ZipFile(ZIPファイル名) as zf:
    zf.extractall()

extractallメソッドの引数にパスを指定することで、展開先を指定することができます。

zf.extractall(パス)

サンプル

先ほど圧縮のサンプルで作成したtest.zipを解凍してみます。

import zipfile

with zipfile.ZipFile('test.zip') as zf:
    zf.extractall()

先ほどのコードを実行すると、以下のようにZIPファイルが全て展開されました。

まとめ

この記事では、Pythonのデータの圧縮と解凍について解説しました。

今回のおさらい

  • 圧縮 = 『情報量を保ったまま、サイズを小さくした別データに変換すること』 
  • 解凍 = 『圧縮されたデータを元に戻すこと』

データを圧縮することで、パソコンの容量を節約することができます。すぐに必要はないけど保存しておきたいデータなどは圧縮しておくと便利です。

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

タイトルとURLをコピーしました