【第28回PYTHON講座】Zipファイル内のサイズの小さいファイルを削除

PYTHON

今回は、PYTHONを使って、Zipファイル内のサイズの小さいファイルを削除するプログラムを作ってみたいと思います。

プログラムの内容

ZIPファイル内に複数のJPGファイルがあります。その中で、極端にファイルサイズが小さいものがあり、そのファイルだけを削除します。また、ZIPのファイル名の変更はしないようにし、削除処理がされたかをコメント出力します。

今回は、下記のzipファイルを使用します。rabbit.zipというファイルの中にjpgファイルが格納されていますが、1つだけファイルサイズが小さいもの(rabbit(7).jpg)があります。そのファイルを削除します。

zipファイル内

ライブラリについて『zipfile』、『shutil』

使用するライブラリは、『zipfile』、『shutil』の2つになります。

zipfile』は、zipファイルの操作をする為に使用します。

shutil』は、ファイルの置き換えをする時に使用します。

zipfileのライブラリがインストールされていなければ、下記のコマンドでインストールをして下さい。

#zipfileをインストール
pip install zipfile

プログラム

import zipfile
from shutil import move


ofile = 'C:/Labo/trial/rabbit.zip'
bfile = 'C:/Labo/trial/bfr.zip'
fsize = 6000
tsign = 0

zip1 = zipfile.ZipFile (ofile, 'r')


for item in zip1.infolist():
    if item.file_size <= fsize:
        tsign =1

if tsign == 1:
    zip2 = zipfile.ZipFile (bfile, 'w')

    for item in zip1.infolist():
        buffer = zip1.read(item.filename)
        if item.file_size > fsize:
            zip2.writestr(item, buffer)

    zip2.close()


zip1.close()


if tsign == 1:
    move(bfile, ofile)
    print(ofile + '書き換えられました')
else :
    print(ofile + '書き換えるファイルはありませんでした')





1、2行目:ライブラリを宣言します。

5、6行目ofileはオリジナルのファイルです。bfileは一時ファイルです。小さいファイルを取り除いたzipファイルをbfileとして作成します。プログラム後半で、ofileに置き換える(move)ことによって、bfileは無くなります。

7行目:削除するファイルサイズの大きさを設定します。fsize以下の大きさならば削除します。今回削除したいファイルは5831byteなので6000にしてます。

8行目tsignは処理(ファイル削除)がされたかどうかを確認するフラグになります。0の場合は処理されず、1の場合は処理されたことになります。

10行目:zipファイルを読み込む関数です。rはread(読む)になります。

13から15行目infolistでzip内の個々のファイルをitemに入れていきます。

file_sizeでitemに格納されたファイルのサイズを取り出すことが出来ます。fsizeと比較して削除されるファイルがあるかを確認し、削除するファイルがある場合、tsignを1に設定します。

17から25行目:削除するファイルがある場合の処理。bfileのzipファイルを書き換えモードwで作成します。

先ほどと同様にファイルサイズを比較し、ファイルサイズが大きければ、bufferに格納し、writestrで、bfileに追記していきます。

処理が終わればclose()でzipファイルを閉じてください。

32行目:処理が発生した場合、bfileofileに置き換えmoveします。この処理をしないと、一時ファイルbfile(bfr.zip)を削除することが出来ません

下記の通り、ファイル名を変更することなく、zipファイルを変更することが出来ました。

処理後のzipファイル内

まとめ

いかがだったでしょうか。

画像をzipファイルでまとめた時に、不要なファイルがある時があります。その時には、上記のファイルを使えば、ファイル名を変更することなく取り除くことが出来ます。

是非、みなさんも色々と応用してくださいね。


コメント

タイトルとURLをコピーしました