Information High

勉強に使ったり、仕事で詰まったIT技術の備忘録

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)
 ||<