【経緯】
業務で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/