Pythonでファイルをzipに圧縮する
はじめに
Pythonでzipファイルに圧縮する方法の紹介です。
まあ、正直いろんなサイトで紹介されているので、いまさら感はありますが。
前の記事とあわせてrar圧縮をzip圧縮に変更したかったので。
ソースコード
今回もいきなりソースコード。
createZip()のメソッドを呼んでもらえば動きます。
第1引数=圧縮対象のフォルダ名、第2引数=zipファイルを出力するフォルダ名、第3引数=zipファイル名です。
import zipfile from zipfile import ZipFile, ZipInfo import os import shutil class createZip(): # Zipファイルの作成 def createZip(self, inputPath, outputPath, createFileName): zipTargets = [] # 作成するzipファイルのフルパス zipfilepath = os.path.abspath(outputPath + createFileName) # walkでファイルを探し、圧縮対象のファイルリストに加えていく。 for dirpath, dirnames, filenames in os.walk(inputPath): for filename in filenames: filepath = os.path.join(dirpath, filename) # 作成するzipファイルのパスと同じファイルは除外する if filepath == zipfilepath: continue arc_name = os.path.relpath(filepath, os.path.dirname(inputPath)) zipTargets.append((filepath, arc_name)) for dirname in dirnames: filepath = os.path.join(dirpath, dirname) arc_name = os.path.relpath(filepath, os.path.dirname(inputPath)) + os.path.sep zipTargets.append((filepath, arc_name)) # zipファイルの作成 zip = zipfile.ZipFile(zipfilepath, 'w') for filepath, name in zipTargets: zip.write(filepath, name, zipfile.ZIP_DEFLATED) zip.close()
補足
といっても、だいたいコメントに書いてあるので自分の備忘としては圧縮方法の指定くらいかな。
圧縮方法の指定
zip.write()するときに圧縮方法の指定ができる。
- zipfile.ZIP_STORED: 圧縮せず複数ファイルをまとめるだけ(デフォルト)
- zipfile.ZIP_DEFLATED: 通常のZIP圧縮(要zlibモジュール)
- zipfile.ZIP_BZIP2: BZIP2圧縮(要bz2モジュール)
- zipfile.ZIP_LZMA: LZMA圧縮(要lzmaモジュール)
らしい。bz2, lzmaはなじみが無いので、通常のZIP圧縮(ZIP_DEFLATED)で圧縮することにした。
あと、圧縮なし(zipfile.ZIP_STORED)はtarみたいなイメージなのだと思うけど、ファイル単位で圧縮しないことができるって、どうやっているのか…
zipとかすでに圧縮済みのファイルをこれ以上圧縮しようとしても、時間がかかるだけで圧縮効率が悪いから圧縮なし(zipfile.ZIP_STORED)でまとめる。
と書いてあったので、使い道も「なるほど」といった感じ。
createZip()のメソッドを呼びかた
クラスにしているので、以下のようにインスタンスを作ってから呼んでください。
czfClass = controlZipFile.createZip() #インスタンス生成
czfClass.createZip(UNRAR_DIR_NAME, ZIP_OUTPUT_DIR, zipFileName)
||<