どうも、shirokumaです。
どうやら最近はPython系キーワード経由でのアクセスが多いので、ちょっと寄せてみます。
Python初心者が動くからOKとするプログラム。体裁は気にしない。
さて、今回はフォルダ毎に圧縮したい場合。
フォルダを一つ選んで圧縮する、次を選んで圧縮する、ということはしばしばあると思いますが、その数が膨大になるといちいちマニュアルでやってられませんよね。
かといって、複数のフォルダを一つのフォルダに入れて丸ごと圧縮すると、いざ解凍するときに不便かもしれません。Windowsだったら意識的に解凍しなくてもフォルダの中が見れる、コピーできるというツッコミはこの際置いておきましょう。
今回は親フォルダの中にある複数のサブフォルダをサブフォルダ毎にzip化するコードです。
まぁ、もちろん似たようなコードは山のようにネットに落ちていますが、できるだけ短くをモットーにお伝えします。ちなみにPythonは3.6系で使ってます。
import os
import zipfile
FolderPath = r’ /Users/UserName/Desktop/ziptest/ ‘
Directories=[]
for x in os.listdir(FolderPath):
if os.path.isdir(FolderPath + x):
Directories.append(FolderPath +x)
for Direcs in Directories:
zf =zipfile.ZipFile(Direcs + ‘.zip’ , ‘w’, zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk(Direcs):
for file in files:
zf.write(Direcs + “/’ + file, file)
zf.close()
print (Direcs + ‘ Complete ! ‘)
ブログだとスペースが自動で削除されてしまうので、いい感じでスペースをいれてください。
Pythonはスペースで文法を認識するので、例えば少なくともfor の次の1行は1字以上下げる必要があります。
下げるべきところと下げてはいけないところは、下の解説も参考に考えてみてください。
さて、解説。
まずimportで必要なpackageをもってきます。
FolderPathに親フォルダのアドレスをいれます。Macだと ‘/’ でいけましたが、Windowsだと’¥’とか、特に先頭は’¥¥’とか使わないといけないかもしれません。
それでもってはじめのfor文でDirectoriesを検索してFolderPathのなかにディレクトリがあればAppendします。
そうすると圧縮したいサブフォルダがDirectoriesに格納されます。
次のfor文はDirectoriesに格納されているサブフォルダがある限り繰り返します。for in でこんな書き方ができるのがpythonのいいところ。
さてfor文の中は、Directoriesのあるサブフォルダ(Direcs)に対してその中身の情報を、importしたzipfileの機能を使って、圧縮して書き込む、という処理をしています。言い換えればサブフォルダの中身を全て検索して、一つずつ書き込んでいるわけです。
最後にcloseで書き込みを終了させます。途中経過を見やすくするため一応print文をつけました。そして次のDirecsにいくわけです。
はい。そんなに難しくはないですね。割とシンプルでわかりやすいのではないでしょうか。
短いコードですし、一応動作確認もしたので問題ないと思いますが、基本は自己責任でお願いしますね。
今回はPythonで一度に複数のzipファイルを作成するソースをお届けしました。参考になれば幸い。
あと、サンクスボタンやいいねボタンなどを配置してみましたので、ここまで読みました!ってことでポチっとやっていただければ、非常にモチベーションが上がりますので、どうぞよろしくお願い致します。