Udemyでもプログラミングを教えていますUdemy

【Python】ファイルをまとめて圧縮するプログラム

  • URLをコピーしました!
目次

【Python】zipfileモジュールでファイルをまとめて圧縮する

ZIP ファイルの圧縮/展開はファイルをやりとりするときに欠かせませんね。 今回はそこを自動化します。
今回はPython でZIPファイルを圧縮/展開する方法を説明します。

https://www.youtube.com/watch?v=vP57VU3GSgQ

ZIPファイルはファイル圧縮形式の1つで、 WindowsやmacOSが標準サポートしているため、さまざまな状況で使われています。

ZIPファイルのメリットは、ファイルサイズを小さくできることに加えて、複数のファイルやフォルダを一つにまとめられることです。

そのため、メールやインターネットでファイルをやりとりする際は、ZIPファイルにしてから送るのが一般的です。
今回のプログラム (compression.py) は、ZIPファイルの圧縮と展開を連続して実行します。

import shutil
import os
import glob
import zipfile

def make_zip(path, zip_filename):
"""フォルダを指定して圧縮ファイルを作成"""
# 現在のパス(フォルダ位置)を保存
current_path = os.getcwd()
# zipファイルの保存先とファイル名を保存
zip_file = os.path.join(current_path, zip_filename)
# 圧縮するデータが保存されているフォルダを保存
pack_files = os.path.join(current_path, path)
with zipfile.ZipFile(zip_file, "w") as zf:
# 圧縮するデータが保存されているフォルダに移動
os.chdir(pack_files)
for pack_file in glob.glob("*.xlsx"):
zf.write(pack_file)
# プログラム開始時のフォルダに移動
os.chdir(current_path)


def extract_zip(zip_filename):
"""指定したzipファイルを展開する"""
with zipfile.ZipFile(zip_filename) as zf:
# すべてのファイルを展開
zf.extractall("展開先")


# 支店別顧客データのエクセルファイルを圧縮
make_zip("支店別顧客データ", "支店別データ.zip")
# zipファイルを展開
extract_zip("支店別データ.zip")

 標準ライブラリのzipfile モジュールを使ってZIPファイルを操作

① プログラムを実行
② ZIPファイルが作成される

③続いて展開もされるため、 中のxlsx ファイルが現れる

compression.py には、圧縮を行う make_zip 関数と、 展開を行う extract_zip関数が定義されていて、それらを続けて呼び出しています。

make_zip関数は、引数 pathに渡された場所にあるファイルを圧縮し、 引数zip_filename で指定した名前のZIPファイルにします。

実際に圧縮を行っているのは、with文のブロックです。 zipfile.ZipFile 関数でZIPファイルを作成し、 glob 関数でExcelファイルを列挙しwrite メソッドでZIPファイルに追加します。

ぽちろう

ここではExcelファイルだけを圧縮していますが、 glob 関数のパターンをに変更すれば、圧縮対象のファイルを増やせますよ。

extract_zip関数はよりシンプルで、with文でファイルを開き、 extractall メソッドですべて展開しています。
パスワード付きZIPファイルを展開する場合は、引数 pwdにパスワードを指定します。

例えばパスワードが 「test」 の場合は、次のように指定します。

zf.extractall(pwd=”test”.encode())

.encode()」 がないとエラーになるので注意してください

なお、環境によっては、パスワード付きZIPファイルの展開時に日本語ファイル名が文字化けすることがあります。

shutil を利用した圧縮/展開

shutil (Shell Utilities) モジュールは、高レベルのファイル操作用の Python モジュールです。 ファイルとディレクトリをコピーするための機能、およびファイル管理のためのその他のユーティリティ機能を提供します。

単純にフォルダを丸ごと圧縮したい場合は、 shutil のmake_archive 関数を使うこともできます。
shutilモジュールの make_archive 関数は、 第1引数に拡張子抜きのファイル名、 第2引数に圧縮形式、 第3引数に圧縮対象のフォルダを指定します。

shutil.make_archive(“archivename”, “zip”, “支店別顧客データ”)

展開したいときはunpack_archive 関数を使います。 引数はZIPファイル名と展開先のフォルダ名です。 フォルダが存在しないときは自動作成されます。

shutil.unpack_archive(“archivename.zip“, “archivename”)

shutilモジュールを使ったほうが簡単ですね。

てらやん

その代わり、圧縮するファイルの種類を限定したり、パスワード付きZIPファイルを展開したりすることはできません。 簡単ですが制限もあるということですね。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次