【第29回PYTHON講座】Zipファイル:ファイル形式の違いでファイルを削除

PYTHON

こんにちは!

今回は、PYTHONを使って、Zipファイル内で圧縮されているファイルの中でファイル形式が違うファイルを削除するプログラムを作ってみたいと思います。

プログラムの内容

ZIPファイル内に複数のJPGファイルに圧縮されています。しかし、その中で、TXTファイルが紛れているので、TXTファイルを削除します。また、ZIPのファイル名の変更はしないようにし、削除処理がされたかをコメント出力します。

今回は、下記のzipファイルを使用します。rabbit.zipというファイルの中にjpgファイルが格納されていますが、TXTファイルが複数紛れています。JPGファイルを残し、TXTファイルを削除します。

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'
fextension = 'jpg'
tsign = 0 
dfile = list()


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


for item in zip1.infolist():
    if item.filename.endswith(fextension) == 0:
        tsign =1


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

    for item in zip1.infolist():
        buffer = zip1.read(item.filename)
        if item.filename.endswith(fextension) == 1:
            zip2.writestr(item, buffer)
        else :
            dfile.append(item.filename)

    zip2.close()


zip1.close()


if tsign == 1:
    move(bfile, ofile)
    print('deleted files are ')
    print(dfile)
else :
    print(ofile + '内で削除するファイルはありませんでした')


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

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

7行目:ZIPファイル内で残したいファイル形式jpgを指定します。

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

9行目:削除されたファイル名を格納するリストdfileを作成します。

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

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

itemfilenameを付けることにより、拡張子を含めたファイル名を取得することが出来ます。

endswith文字列の後半の文字検索の関数になります(前半の文字検索はstartswtich)。JPGファイル以外が存在するかをNOT判定でチェックし、存在する場合はtsignを1に設定します。

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

先ほどと同様にファイル名の文字検索をし、JPGファイルのみをbufferに格納しwritestrで、bfileに追記していきます。追加しないファイル(削除するファイル)はdfileに格納します。

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

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

38,39行目:処理が発生した場合、下記の通り、削除されたファイルを出力します。これで、どのファイルが取り除かれたかを知ることが出来ます。

削除したファイル

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

処理後のzipファイル内

まとめ

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

前回はファイルサイズを基準にファイル削除を行いましたが、今回は拡張子を基準にファイル削除を行いました。

見ていただくとわかりますが、ファイル名に拡張子が含まれている格好なので、拡張子ではなく、ファイル名のパターンでファイル削除することも可能です。その為、色々と応用が可能だと思います。

是非、みなさんも試してみて下さい。


PYTHON
スポンサーリンク
シェアする
フォローする
OPTY LIFE(オプティライフ)

コメント

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