フォルダ内のファイルを複数毎にzip形式に圧縮


press
フォルダ内のファイルを複数毎にzip形式に圧縮
Posted by press

フォルダ内のファイルを複数毎にzip形式に圧縮

ファイルをまとめてzip形式に圧縮してしまうと容量が増えてしまうので、メールなどで送るために複数個に分けて圧縮ファイルを作りたいときがあります。ファイル数がそれほど多くないときは手動でも対応できますが、ファイル数が多い場合は自動化すると作業を効率化できます。

開発環境

$ python -V
Python 3.7.0

$ tree
├── archive.py
├── files
└── zip

コード

import datetime
import glob
import zipfile
from time import sleep

zip_cnt = 0
for filename in sorted(glob.glob("files/*.jpg")):
    if zip_cnt == 0:
        dt = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
        zip_name = 'zip/' + dt + '.zip'

        zip_files = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
        zip_files.write(filename)
        zip_cnt += 1

    elif zip_cnt == 5:
        zip_files.close()
        zip_cnt = 0
        sleep(1)

    else:
        zip_files.write(filename)
        zip_cnt += 1

if not zip_files.close():
    zip_files.close()
else:
    pass

print('圧縮が終わりました。')

解説

import datetime
import glob
import zipfile
from time import sleep
モジュールを読み込む

zip_cnt = 0
カウント用の変数を作ります

for filename in sorted(glob.glob("files/*.jpg")):
filesフォルダ内の拡張子がjpgファイルを読み込む(*はワイルドカードで全てのjpgファイルが対象)

dt = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
圧縮ファイルのネーミング用に現在時刻を取得

zip_name = 'zip/' + dt + '.zip'
圧縮ファイルの名前を作成(生成した圧縮ファイルはzipフォルダに格納)

zip_files = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
zip形式の圧縮ファイルを生成(圧縮する場合は第三引数に‘ZIP_DEFLATED’を指定)

zip_files.write(filename)
生成した圧縮にファイルに読み込んだファイルを追加

zip_cnt += 1
カウントに追加

elif zip_cnt == 5:
ファイルを5件ごと圧縮するので5に設定

zip_files.close()
圧縮ファイルをクローズ

補足

圧縮する件数が少ないと一秒間に複数回処理が行われてしまい、圧縮ファイルが正常に書き出されないので、圧縮ファイルをクローズした後にsleep(1)で一秒間スリープさせています。


当ブログは、群馬県でPython / Djangoを中心にウェブアプリケーションを開発している株式会社ファントムが運営しています。

投稿についてのお問い合わせ




Show Comments (0)

Comments

Related Articles

Django

DjangoでダウンロードするCSVの文字コードを設定

以下のような、attachmentをつけて即ダウンロードが始まるシステムで、文字コードをShift-JISにする為にto_csv()の引数にencodingをShift-JISに設定しても、ダウンロードするとUTF-8で […]

Posted on by press
Django

Djangoのテンプレートにrangeを渡す

Djangoのテンプレートに範囲を渡す方法です。指定した月の全日数を表示したいときや日毎に処理をして表示させたいときなどにrangeに範囲を入れてテンプレートに渡せます。 views.py 現在の年と月を指定して総日数を […]

Posted on by press