Not normal

普通の奴らの上を行け!斜め真ん中上の選択

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()