NO IMAGE

【Python】ファイルをまとめて圧縮する

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

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

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")

 Python では標準ライブラリのzipfile モジュールを使ってZIPファイルを操作できます。

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


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

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

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

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

 

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

 

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

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

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

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

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

shutil を利用した圧縮/展開

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

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

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

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

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

 

 

 

 

NO IMAGE
最新情報をチェックしよう!
>プログラミング 独学

プログラミング 独学

本当にプログラミングを学びたい人のためになるブログにしたいと思っていますので、些細なことでも気が付いたのであればご報告いただけると幸いです。

CTR IMG