右クリックメニューから簡単に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'