Pythonでディレクトリをzip圧縮する

メモ。ファイルなら簡単なのに、ディレクトリだと面倒。
os.walkでファイルを探してzipに追加する。

# coding: utf-8
import os
import sys
import zipfile

def zip_directory(path):
    zip_targets = []
    # pathからディレクトリ名を取り出す
    base = os.path.basename(path)
    # 作成するzipファイルのフルパス
    zipfilepath = os.path.abspath('%s.zip' % base)
    # 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():
    zip_directory(sys.argv[1])

if __name__ == '__main__':
    main()
$ python main.py /home/tokibito/test_directory