見出し画像

【4】アプリ開発:全自動解凍処理

Webアプリを作るとき大変お世話になるのが、フリーアイコンである。特にモノクロ&pngのものはCSSで背景色を設定してあげるだけで立派なボタンができあがるので重宝している。

現在作成中の薬図鑑アプリ。ヘッダーのアイコンはどれもフリーサイトより。

特に使いやすいと感じているのは以下のサイト。

しかし、どのフリーアイコンサイトでも、一つだけ面倒な点がある。それが「解凍」である。ネットから圧縮形式でダウンロードするため、例えば20個好きなアイコンをダウンロードすると、その回数だけ「左クリック→すべて展開→展開」をしなければならない。面倒だし時間もかかる。すると、どうしても心のどこかでダウンロードするのをためらってしまい、それがアプリのデザインにも直結してしまう。

ということで、フォルダ名を指定してエンターキーを押すだけで、そのフォルダ内のzipファイルをすべて解凍してしまうという神コードを作成した。

さきほど掲載したサイトでは、解凍後もフォルダ構造がなぜか「1234/1234/1234.png」のように重複してしまうため、それを「1234.png」に直接アクセスできるようにしておいた(この機能はこのサイトのみ必要なため、他の解凍処理では外しておく)。

その結果

こんなにたくさんの圧縮ファイルが…
フォルダ指定&ワンクリックで一瞬で解凍!

機械強い!

最後に、今回作成したコード(Python)を掲載しておきます。必要な追加ライブラリは特にないです。コマンドプロンプトなどからそのまま実行できるため、同じ悩みを持つ方は是非コピペして使ってみてください。
(最初のみ、解凍先のフォルダ場所など随時書き換えてください!)

ではでは!

import zipfile, os, glob
import shutil

# 【書き換える場所】zip_dirのみ

# ZIPファイルのパスを指定 --- (*1) 
zip_dir = "C:/Users/{ユーザー名}/Downloads/new_icon"

# 解凍先のフォルダを指定 --- (*2) 
#script_dir = os.path.dirname(__file__) # C:\Users\{ユーザー名}\MyWebApps\_python_function()
#print(__file__)  # 1_zip.py
script_dir = "C:/Users/{ユーザー名}/Downloads" 


out_dir = os.path.join(script_dir, 'output_raw')  #ファイル名とフォルダ名を結合してパスを作成
#print(out_dir) # C:/Users/{ユーザー名}/Downloads\output

# ZIPファイルを列挙 --- (*3) 
files = glob.glob(zip_dir + "/*.zip") 
for f in files:
    print("unzip:", f) 
    # ファイル名取得
    name = f.split('\\')
    name = name[1][:-4]
    name = name.split('-')[0]
    name += '/'
    #print(name) # 11243/

    # 解凍先のフォルダを動的に決定 --- (*4) 
    base = os.path.basename(f).replace(".zip", "")  #ファイル名を取得&名前変更
    unzip_path = os.path.join(out_dir, base)        #解凍後ファイルのパス作成     # C:/Users/{ユーザー名}/Downloads/output/1111
    #print('unzip_path:', unzip_path) # C:/Users/{ユーザー名}/Downloads\output_raw\11243-1

    # 解凍 --- (*5) 
    with zipfile.ZipFile(f, 'r') as f:
        f.extractall(unzip_path)

    path = os.path.join(unzip_path, name) # 移動させるディレクトリのパス
    #print('path      :', path) # C:/Users/{ユーザー名}/Downloads\output_raw\11243-1\11243/

    new_path = shutil.move(path, os.path.join(script_dir, 'output')) # ファイル移動
    # shutil.move(移動させたいファイルやディレクトリのパス, 移動先のディレクトリのパス)  

# output_rawフォルダを削除
shutil.rmtree("C:/Users/{ユーザー名}/Downloads/output_raw")

いいなと思ったら応援しよう!