【簡単】Pythonのzipfileでファイルを圧縮・解凍する方法

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2022年12月)

✔このような方へ向けて書かれた記事となります

「Pythonを使ってファイルを圧縮したい」

「PythonでZIPファイルを解凍するにはどうしたら良いの?」

「zipfileの使い方を知りたい」

✔当記事を通じてお伝えすること

  • Pythonのzipfileモジュールでできること
  • zipfileでファイルをZIP化する方法
  • zipfileでファイルを解凍する方法

当記事では、zipfileの基本的な使い方はもちろん、具体例とともに応用した使い方まですべて解説しています。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Python zipfileでできること

Pythonのzipfileモジュールでできることを見ていきましょう。

何ができるのかの全体像がわからなければ、何を学べば良いかが明確になりません

  • ファイルをZIP化
  • ZIP化されたファイルの解凍

ファイルをZIP化

zipfileモジュールを使うと、ファイルをZIP化できます。

ZIP化とは、.zipの拡張子を持つファイルにすることです。

具体的には以下のような処理をしています。

  • 複数のファイルをひとつにまとめる
  • 圧縮する

メールなどで送信する際に、ZIP化は便利です。

ZIP化されたファイルの解凍

ZIP化されたファイルを解凍するのも、zipfileモジュールの役目。

解凍とは、圧縮されまとめられたファイル群を、特定のフォルダ内で使えるように戻すことです。

zipfileモジュールを使えば、ZIP化したり、ZIP化から元に戻したりできるようになります。

Python zipfileモジュールでファイルをZIP化する方法

具体的に、zipfileモジュールでファイルをZIP化していきましょう。

ZIP化は、zipfileモジュールの主な役割のひとつです。

  • zipfileでZIP化する際の基本構成
  • zipfileでフォルダごとZIP化する
  • zipfileで既存のZIPファイルにファイルを追加する
  • zipfileの圧縮方式を変える

zipfileでZIP化する際の基本構成

zipfileでファイルをZIP化する方法は主に以下の2とおり。

  • 変数を作る方法
  • withを使う方法

変数を作る方法

変数を作る方法では、以下のような流れです。

import zipfile
変数 = zipfile.ZipFile(ZIPファイル名, “w”)
変数.write(追加するファイル)
変数.close()

必ず最後は、インスタンスをcloseしなければなりません。

具体例を見ていきましょう。

作成前のフォルダツリー
.
├── test1.txt
└── test2.txt
「archive.zip」の作成

変数「zp」にZipFileオブジェクトを保存し、処理を進めます。

zp = zipfile.ZipFile("archive.zip", "w")
zp.write("test1.txt")
zp.write("test2.txt")
zp.close()
作成後のフォルダツリー
.
├── archive.zip
├── test1.txt
└── test2.txt

withを使う方法

withを使う方法も見ていきましょう。

withを使うと、closeメソッドが不要になります。

with zipfile.ZipFile(ZIPファイル名, "w") as 変数名:
    変数名.write("追加するファイル")

具体的に見ていきます。

作成前のフォルダツリー
.
├── archive.zip
├── test1.txt
└── test2.txt
「archive2.zip」の作成

変数「zp」にZipFileオブジェクトを保存し、処理を進めます。

import zipfile
with zipfile.ZipFile("archive2.zip", "w") as zp:
    zp.write("test1.txt")
    zp.write("test2.txt")
作成後のフォルダツリー
.
├── archive.zip
├── archive2.zip
├── test1.txt
└── test2.txt

zipfileでフォルダごとZIP化する

フォルダごとZIP化したい場合は以下のとおりです。

import zipfile, os
with zipfile.ZipFile(ZIPファイル名, "w") as dirzip:
    for d, s, f in os.walk(ZIP化するフォルダ名):
        dirzip.write(d)
        for file in f:
            dirzip.write(f"{d}/{file}")

具体的には以下のとおりとなりました。

import os, zipfile
with zipfile.ZipFile("dir.zip", "w") as dirzip:
    for d, s, f in os.walk("test_dir"):
        dirzip.write(d)
        for file in f:
            dirzip.write(f"{d}/{file}")

新たなファイルを既存のZIPファイルに追加する

新たなファイルを既存のZIPファイルに追加するには、ZipFileの第二引数を”w”から”a”に変えます。

この”w”や”a”はmodeを表しており、ファイルを読みこむのか書き込むのかなどを指定するものです。

  • “w”:新規作成(書き込み)
  • “a”:追加書き込み
  • “r”:読み込み

具体的に、test_dir > test3.txtを既存のZIPファイルに追加してみます。

import zipfile
with zipfile.ZipFile("archive.zip", "a") as zp:
    zp.write("test_dir/test3.txt")

zipfileの圧縮方式を変える

zipfileの圧縮方式を変える方法があります。

デフォルトでは、圧縮はおこなわずに、単にファイルをまとめているだけになっているのです。

# constants for Zip file compression methods

ZIP_STORED = 0

ZIP_DEFLATED = 8

ZIP_BZIP2 = 12

ZIP_LZMA = 14

zipfile.py|Python

例えば、ZIP_DEFLATEDを適用させるには以下のとおり。

import zipfile
with zipfile.ZipFile("archive_sample.zip", "w", zipfile.ZIP_DEFLATED) as zp:
    zp.write("test1.txt")

第三引数に指定するのです。

Python zipfileモジュールでZIPファイルを解凍する方法

zipfileモジュールを使ってZIPファイルを解凍する方法を見ていきましょう。

ZIP化だけでなく、解凍にも使えるのです。

  • ZIPファイル内のすべて・もしくは複数を展開:extractall()
  • ZIPファイル内の単一ファイルを展開:extract()

ZIPファイル内のすべて・もしくは複数を展開:extractall()

extractallを使うとZIP内の複数のファイルを展開できます。

extractall(path=None, members=None, pwd=None)

カレントディレクトリに展開

extractallメソッドに引数はいりません。

デフォルトのままであれば、カレントディレクトリに展開されます。

import zipfile
zp = zipfile.ZipFile("archive.zip", "r")
zp.extractall()
zp.close()

カレントディレクトリ以外に展開:pathを指定

カレントディレクトリ以外であれば、第一引数「path」に値を入力します。

import zipfile
zp = zipfile.ZipFile("archive.zip", "r")
zp.extractall("new_dir")
zp.close()

new_dirというフォルダ内に展開されます。

一部のみ解凍:membersを指定

一部のみ回答したい場合は、membersにファイルリストを与えます。

import zipfile
zp = zipfile.ZipFile("archive.zip", "r")
zp.extractall(path="new_dir", members=["test1.txt","test_dir/test3.txt"])
zp.close()

単一のファイルを展開:extract()

extractメソッドでは、第一引数「member」を指定して、一ファイルのみ展開できます。

import zipfile
zp = zipfile.ZipFile("archive.zip", "r")
zp.extract("test2.txt")
zp.close()

どれもwithを使って展開も可能です。

Python zipfileモジュールで使える属性・メソッド7選

今までご紹介したメソッド以外にも使えるメソッドがあるのでご紹介します。

使いこなすには、さまざまなメソッドを知っておくと便利だからです。

  • getinfo
  • infolist
  • namelist
  • printdir
  • filename
  • mode
  • pwd

getinfo

getinfoメソッドは、ZIP内のファイルの情報を確認できます。

引数でファイル名を入れるのを忘れないようにしましょう。

>>> import zipfile
>>> zp = zipfile.ZipFile("archive.zip", "r")
>>> zp.getinfo("test1.txt")
<ZipInfo filename='test1.txt' filemode='-rw-rw-r--' file_size=0>
>>> zip.close()

infolist

infolistメソッドは、ZIP内のファイルすべての情報を得られます。

引数は不要です。

>>> import zipfile
>>> zp = zipfile.ZipFile("archive.zip", "r")
>>> zp.infolist()
[<ZipInfo filename='test1.txt' filemode='-rw-rw-r--' file_size=0>, <ZipInfo filename='test2.txt' filemode='-rw-rw-r--' file_size=0>, <ZipInfo filename='test_dir/test3.txt' filemode='-rw-rw-r--' file_size=0>]
>>> zip.close()

namelist

namelistメソッドでは、ZIP内にあるすべてのファイル名が取得できます。

すべてのファイルが対象なので、引数は不要です。

>>> import zipfile
>>> zp = zipfile.ZipFile("archive.zip", "r")
>>> zp.namelist()
['test1.txt', 'test2.txt', 'test_dir/test3.txt']
>>> zip.close()

printdir

printdirメソッドを使うと、ZIP内のファイルについて、以下の情報が得られます。

  • ファイル名
  • 更新日
  • ファイルサイズ
>>> import zipfile
>>> zp = zipfile.ZipFile("archive.zip", "r")
>>> zp.printdir()
File Name                                             Modified             Size
test1.txt                                      2022-12-18 05:47:46            0
test2.txt                                      2022-12-18 05:47:46            0
test_dir/test3.txt                             2022-12-18 17:05:30            0
>>> zip.close()

filename

filename属性を使うと、ZIPファイル名を表示できます。

>>> import zipfile
>>> zp = zipfile.ZipFile("archive.zip", "r")
>>> zp.filename
'archive.zip'
>>> zip.close()

mode

mode属性を使うと、インスタンスのmodeを確認できます。

>>> import zipfile
>>> zp = zipfile.ZipFile("archive.zip", "r")
>>> zp.mode
'r'
>>> zip.close()

pwd

pwd属性で、ZIPファイルに設定されているパスワードが確認できます。

>>> import zipfile
>>> zp = zipfile.ZipFile("archive.zip", "r")
>>> zp.pwd
b''
>>> zip.close()

Pythonのzipfile以外でZIP化ファイルを操作するモジュール

zipfileモジュール以外にも、ZIPファイル操作ができるモジュールを紹介します。

ほかにも知っておくことで、よりパフォーマンスの良いものが使えるようになるのです。

  • ZIP化:shutil.make_archive
  • ZIPファイルの解凍:shutil.unpack_archive()

ZIP化:shutil.make_archive

shutilを使って、ZIP化する方法は以下のとおり。

shutil.make_archive(ZIPファイル名, format=”zip”, root_dir=ZIP化したいファイルのあるフォルダ)

例えば,「shutil_dir」をZIP化するには以下のとおり。

$ tree
.
└── shutil_dir
    ├── test1.txt
    └── test2.txt
$ python
>>> import shutil
>>> shutil.make_archive("shutil_archive", format="zip", root_dir="shutil_dir")
'/home/yulikepython/Documents/dev-test/shutil_archive.zip'
>>> quit()
$ tree
.
├── shutil_archive.zip
└── shutil_dir
    ├── test1.txt
    └── test2.txt

ZIPファイルの解凍:shutil.unpack_archive

shutil.unpack_archiveで、フォルダをすべて展開できます。

shutil.unpack_archive(展開したいZIPファイル, 展開先フォルダ)

>>> import shutil
>>> shutil.unpack_archive("shutil_archive.zip", "output")
>>> quit()
$ tree
.
├── output
│   ├── test1.txt
│   └── test2.txt
├── shutil_archive.zip
└── shutil_dir
    ├── test1.txt
    └── test2.txt

2 directories, 5 files

展開先のフォルダは存在しないと、新たに作成されます。

まとめ:Pythonのzipfileモジュールで、ZIPファイルを操作できる

当記事の内容をまとめます。

  • PythonのzipfileモジュールでZIPファイルの操作ができる
  • zipfileでは、さまざまな圧縮方法がある
  • zipfileを使って展開するときは、展開先や展開するファイルを指定できる

zipfileモジュールを使うと、ZIPファイルの操作がとても簡単にできます。

さまざまな圧縮方法がありますので、ぜひいろいろと試してください。

そのほかにPythonのことについて学習したい方はこちらもどうぞ。

独学で学ぶPython|一から応用した使い方まで徹底解説
Pythonについて学習したいですか?当ページでは、Pythonの基本に関する記事をまとめています。Pythonを学ぶことはDjangoを使うWebアプリ開発はもちろん、AI・データサイエンスなどの分野でも役立ちます。
タイトルとURLをコピーしました