(113) zipfileモジュールでZIPファイルを解凍・圧縮

投稿者: | 2019年10月30日

3,116 views

この記事は最終更新から 1804日 が経過しています。

1. やりたいこと

Pythonの zipfile モジュールを使って
・ZIPファイルの解凍
・ZIPファイルの作成
を行いたい。

2. ZIPファイルを解凍する。

(1) 適当な ZIPファイルを用意する。

Windows10パソコンの Explorer上でファイルを選択し、右クリック → [送る] → [圧縮(ZIP形式)フォルダー] などの手順で ZIPファイルを作る。これを Pythonシェルからアクセスできるところに置く。

えっ!
Pythonを使うのでは?

と思ってしまうが、本項の目的は 解凍 なので、予め ZIPファイルを用意しておきたかっただけだ。
Pythonで圧縮したものを解凍する手順でもよいのだが、全く関係のない ZIPファイルを用意したかった。

(2) Pythonの zipfileモジュールで解凍する。

まずは zipfile モジュールを importする。
前述の Windows10で作成した ZIPファイルの名前は test.zip とした。

>>> import zipfile
>>> fpath = './test.zip'

ZIPファイルとして認識されるか?

>>> zipfile.is_zipfile(fpath)
True

Trueと判定されたので、問題の無い ZIPファイルだ。
次に、ZipFile クラスのコンストラクタを使ってインスタンスを生成する。

>>> zf = zipfile.ZipFile(fpath, 'r')

このZIPファイルの中身を見てみる。
namelistメソッドで list型のオブジェクトが返される。

>>> flist = zf.namelist()
>>>
>>> type(flist)
<class 'list'>
>>>
>>> len(flist)
20
>>>
>>> flist
['20190517.csv', '20190522.csv', '20190524.csv', '20190602.csv', '20190610.csv', '20190611.csv', '20190614.csv',
'20190624.csv', '20190626.csv', '20190704.csv', '20190720.csv', '20190723.csv', '20190731.csv', '20190802.csv',
'20190819.csv', '20190823.csv', '20190918.csv', '20191015.csv', '20191023.csv', '20191030.csv']

extractall メソッドで解凍を実行!

>>> zf.extractall()

できた!
bashの shellで確認したところ、確かに中身が解凍されていた。

[user@]$ ll
total 476
-rw-rw-r--. 1 user user  14605 Oct 30 13:43 20190517.csv
-rw-rw-r--. 1 user user  14932 Oct 30 13:43 20190522.csv
-rw-rw-r--. 1 user user  15114 Oct 30 13:43 20190524.csv
-rw-rw-r--. 1 user user  15458 Oct 30 13:43 20190602.csv
-rw-rw-r--. 1 user user  15890 Oct 30 13:43 20190610.csv
-rw-rw-r--. 1 user user  15921 Oct 30 13:43 20190611.csv
-rw-rw-r--. 1 user user  16170 Oct 30 13:43 20190614.csv
-rw-rw-r--. 1 user user  16347 Oct 30 13:43 20190624.csv
-rw-rw-r--. 1 user user  16429 Oct 30 13:43 20190626.csv
-rw-rw-r--. 1 user user  16481 Oct 30 13:43 20190704.csv
-rw-rw-r--. 1 user user   1205 Oct 30 13:43 20190720.csv
-rw-rw-r--. 1 user user  16517 Oct 30 13:43 20190723.csv
-rw-rw-r--. 1 user user  16735 Oct 30 13:43 20190731.csv
-rw-rw-r--. 1 user user  16862 Oct 30 13:43 20190802.csv
-rw-rw-r--. 1 user user  16951 Oct 30 13:43 20190819.csv
-rw-rw-r--. 1 user user  16987 Oct 30 13:43 20190823.csv
-rw-rw-r--. 1 user user  17193 Oct 30 13:43 20190918.csv
-rw-rw-r--. 1 user user  17509 Oct 30 13:43 20191015.csv
-rw-rw-r--. 1 user user  17545 Oct 30 13:43 20191023.csv
-rw-rw-r--. 1 user user  17759 Oct 30 13:43 20191030.csv
-rw-rw-r--. 1 user user 124477 Oct 30 13:38 test.zip

3. ZIPファイルを作成(=ファイルを圧縮)する。

(1) 適当なファイルを用意する。

今回は、上記2で解凍した CSVファイルを圧縮対象とする。

(2) Pythonの zipfileモジュールで圧縮する。

まずは zipfile モジュールを importする。
作成する ZIPファイルの名前を arc.zip とする。

>>> import zipfile
>>> fpath = './arc.zip'

次に、ZipFile クラスのコンストラクタを使ってインスタンスを生成する。
引数 compression で圧縮アルゴリズムを指定しないと、ただ一つのファイルにパックするだけでサイズが縮まない。

>>> zf = zipfile.ZipFile(fpath, 'w', compression=zipfile.ZIP_DEFLATED))

こうして作成したZipFileクラスインスタンスに対して、write メソッドで圧縮対象ファイルを加えていく。

>>> zf.write('20190517.csv')
>>> zf.write('20190522.csv')

できた!
bashの shellで確認したところ、確かにサイズが縮んだ ZIPファイルが出力されていた。

[user@]$ ll *.zip
-rw-rw-r--. 1 user user 11670 Oct 30 14:58 arc.zip

3. 応用

後日追記
・ディレクトリまるごと圧縮
・with構文を使った書き方
・既存のZIPファイルへの追加
・パスワード付き ZIPファイルの作成
などなどを追記予定

x. 参考

ありがとうございます。 m(_ _)m
https://docs.python.org/ja/3/library/zipfile.html : zipfile公式


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です