4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonで指定ディレクトリをZip圧縮する

Last updated at Posted at 2018-07-24

【経緯】

業務でC++とPythonを使うプロジェクトにアサインになりました。業務では初Pythonです。
最初はC++でZipファイル作成しようと思ったんですが、面倒だし分かりにくいし面倒だしでPythonのが良いんじゃねとなりました。(C++歴が一番長いのに)

【要件】

  • ディレクトリごとZip圧縮する
  • 作成したZipファイルはデスクトップに吐き出す
  • 画像などのバイナリファイルは処理時間の割に圧縮率が低いので、圧縮をかけない
  • 作成するZipファイル名は「圧縮元ディレクトリ名.zip」

【コード】

PythonはCODEPREPさんやProgateさんで無料枠の基礎部分をちらっとやったことがあるレベルです。
内容に問題があったり記述に問題があればご指摘ください。。

import zipfile
from zipfile import ZipFile, ZipInfo
import os
import shutil

# 例外ファイルリスト
exclusionList = ['.png', '.jpg', '.bin', '.zip']

# 圧縮対象外の拡張子を判断する
def checkCompress(extention):
    for item in exclusionList:
        if extention == item:
            return False
    else:
        return True

# デスクトップのパスを取得        
def getDesktopPath():
    return os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop" + "\\"

# Zipファイルの作成
def createZip(path):
    zipTargets = []
    # pathからディレクトリ名を取り出す
    base = os.path.basename(path)
    # 作成するzipファイルのフルパス
    createFileName = '%s' % 'default'
    zipfilepath = os.path.abspath(getDesktopPath() + '%s.zip' % createFileName)
    print(zipfilepath)
    # 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
            zipTargets.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
            zipTargets.append((filepath, arc_name))

    # zipファイルの作成
    zip = zipfile.ZipFile(zipfilepath, 'w')
    for filepath, name in zipTargets:
        # 一部のファイルは圧縮をかけずに元ファイルのままZipに追加
        nameStr, extention = os.path.splitext(name)
        if checkCompress(extention):
            zip.write(filepath, name, zipfile.ZIP_DEFLATED)
        else:
            zip.write(filepath, name, zipfile.ZIP_STORED)
    zip.close()

# 圧縮元のディレクトリパス
compressTargetPath = 'compressPath'
createZip(compressTargetPath)
~~~
## 【所感】
業務αでちょこちょこスクリプト言語を触っていた影響か昔ほどスクリプト言語に対して嫌悪感を抱かずにやれました
Python割と好きですまだ基本構文にも慣れないですが。。。特にインデントの制約に慣れない
一年くらい前までは業務ではC++しか触らない人間でしたが見事にC++は書けなくなってました

## 【結論】
Pythonは良いぞ

## 【参考リンク】
* http://tnamao.hatenablog.com/entry/20101211/1292094083
* https://note.nkmk.me/python-zipfile/
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?