(最終更新月:2022年12月)
✔このような方へ向けて書かれた記事となります
「Pythonを使ってファイルを圧縮したい」
「PythonでZIPファイルを解凍するにはどうしたら良いの?」
「zipfileの使い方を知りたい」
✔当記事を通じてお伝えすること
- Pythonのzipfileモジュールでできること
- zipfileでファイルをZIP化する方法
- zipfileでファイルを解凍する方法
当記事では、zipfileの基本的な使い方はもちろん、具体例とともに応用した使い方まですべて解説しています。
ぜひ最後までご覧ください。
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のことについて学習したい方はこちらもどうぞ。