Pythonでディレクトリ内のディレクトリをそれぞれzip圧縮する
はじめに
書籍を裁断してスキャナで読み込んでそれをフォルダに画像として保存しているからそれぞれを圧縮するのが手作業だったのでスクリプトを組んで圧縮させてみた。
ディレクトリをそれぞれ個別にzip圧縮したいときはいろいろありそうなので他のところでも使えそう。
使用モジュール
zipを圧縮するのでzipfileモジュールを使用する。
その他にもディレクトリの参照やらでosモジュールを読み込んでおく。
プログラムの動作
まず、ターミナル上から実行する。
その後に圧縮させたいディレクトリ(フォルダ)があるディレクトリをドラッグ・アンド・ドロップやらで入力する。
それでEnterしてやるとディレクトリ内のディレクトリを次々と圧縮する。
圧縮されたファイルは指定したディレクトリへ保存される。
※プログラムを実行した後にディレクトリを指定させるようにしたのは特に意味はないけどそっちのほうがやりやすそうだと思ったから。
プログラムの流れ
まず、指定されたディレクトリ内にあるフォルダを列挙する。
列挙したディレクトリ名をリストへ格納する。
ディレクトリ内のディレクトリのファイル、フォルダを列挙する。
それぞれzipfileを使って圧縮する。
終わったら次のディレクトリへ
(前に他の人のブログを参考にして作ったのであまり覚えていない…)
ソースコード
#coding:utf-8 import os import zipfile def zip_directory(path): zip_targets = [] # pathからディレクトリ名を取り出す base = os.path.basename(path) # 作成するzipファイルのフルパス #zipfilepath = os.path.abspath('%s.zip' % base) print path zipfilepath = path + ".zip" # walkでファイルを探す for dirpath, dirnames, filenames in os.walk(path): for filename in filenames: filepath = os.path.join(dirpath, filename) # 作成するzipファイルのパスと同じファイルは除外する if filepath == zipfilepath: continue arc_name = os.path.relpath(filepath, os.path.dirname(path)) #print filepath, arc_name zip_targets.append((filepath, arc_name)) for dirname in dirnames: filepath = os.path.join(dirpath, dirname) arc_name = os.path.relpath(filepath, os.path.dirname(path)) + os.path.sep #print filepath, arc_name zip_targets.append((filepath, arc_name)) # zipファイルの作成 zip = zipfile.ZipFile(zipfilepath, 'w') for filepath, name in zip_targets: zip.write(filepath, name) zip.close() def main(): #ディレクトリ内にあるフォルダを列挙 input_line = raw_input() #文字列の前後の空白を削除 input_line = input_line.strip() path = input_line #入力なしの場合、現在のディレクトリを参照 if path == "": path = os.path.abspath("") #サブディレクトリをリストへ格納 zipList = [] for i,j,k in os.walk(path): zipList.append(j) #リスト内にあるサブディレクトリを順に圧縮していく #print zipList[0] #exit() for i in zipList[0]: zip_directory(path + "/" + i) if __name__ == '__main__': main()