PythonでZIPファイルを作る!!

右クリックメニューから簡単にZIP圧縮できますが、Pythonを使ってZIP圧縮すると色々なことができるようになります!

例えば、、、

  • フォルダごとにZIP圧縮する
  • 特定のファイルを除外してZIP圧縮する
  • Mayaなどで保存した時に、古いバージョンのファイルを圧縮して取っておく

などなど色々使い道があります!

今回は、PythonでZIP圧縮についてご紹介したいと思います!

zipfile

Pythonには、ZIP圧縮するためのモジュール「zipfile」が標準であります。嬉しい限りです(*´ω`*)b

基本的なコードは以下の通りです。

import zipfile

with zipfile.ZipFile('ZIPファイル名', 'w', zipfile.ZIP_DEFLATED) as zip:
	zip.write('圧縮したいファイル名', 'zipファイル内でのパス')

Mayaで開いているシーンをZIP圧縮したい場合

import os
import zipfile
from maya import cmds

# 開いているシーンファイルのファイルパスを取得
# 例「C:\Users\owner\Documents\maya\projects\default\scenes\ep00_c000_v00.ma」
filepath = cmds.file(q=True, sn=True)

# シーンファイルのディレクトリを取得
# 「C:\Users\owner\Documents\maya\projects\default\scenes」になる
dirname  = os.path.dirname(filepath)

# シーンファイルのファイル名
# 「ep00_c000_v00.ma」になる
basename = os.path.basename(filepath)

# 拡張子を取り除く
# 「ep00_c000_v00」になる
name   = basename.split('.')[0]

# ZIPファイルを作成するパスを組み立てる
# 「C:\Users\owner\Documents\maya\projects\default\scenes\ep00_c000_v00.zip」になる
output = os.path.join(dirname, name+'.zip')

# ZIPファイルの作成
with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as zip:
	# シーンをZIPファイルに書き込む
	# 「C:\Users\owner\Documents\maya\projects\default\scenes\ep00_c000_v00.ma」を
	# ZIP内に「ep00_c000_v00.ma」として書き込む
	zip.write(filepath, basename)

ディレクトリを圧縮する

ファイルの圧縮は簡単ですが、ディレクトリ(またはディレクトリツーリ)を圧縮する場合は、結構面倒くさいんですよね、、、(;´∀`)

そんな時は、「yield」を使って「ファイル一覧のジェネレーターを作って」から圧縮処理をすると、良いかと思います(`・ω・´)ゞ

yieldでファイル一覧を取得する」も合わせてご覧ください!

import os
import zipfile
from maya import cmds

def getDirectryTree(rootDir):
	for root, dirs, files in os.walk(rootDir):
		for file in files:
			yield os.path.join(root, file)

# プロジェクトのパスを取得
# 例「C:\Users\owner\Documents\maya\projects\default」
projectPath = os.path.normpath(cmds.workspace(q=True, rd=True))

# プロジェクトのディレクトリを取得
# 「C:\Users\owner\Documents\maya\projects」になる
parentPath  = os.path.dirname(projectPath)

# シーンファイルのファイル名
# 「default」」になる
projectname = os.path.basename(projectPath)

# ZIPファイルを作成するパスを組み立てる
# 「C:\Users\owner\Documents\maya\projects\default.zip」になる
output = os.path.join(parentPath, projectname+'.zip')

# ZIPファイルの作成
with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as zip:
	# プロジェクトにあるファイルを処理する
	for filepath in getDirectryTree(projectPath):
		print 'write : ', filepath
		
		# ZIPのパスに、プロジェクトのパスが入らないように消す
		# 「C:\Users\owner\Documents\maya\projects\default\workspace.mel」を
		# 「default\workspace.mel」にする
		zipPath = filepath.replace(parentPath, '')
		
		# ZIPファイルに書き込む
		zip.write(filepath, zipPath)
		
print 'Done'