Pythonでzipファイルの圧縮と展開をするには?

python Python
この記事は約5分で読めます。
スポンサーリンク

メールで添付ファイルを送信するときにファイルを圧縮して送ることは多いと思います。
今回は、Pythonでzipファイルの圧縮と展開をする方法について紹介したいと思います。

Pythonなら標準のライブラリで簡単にファイルの圧縮と展開をすることができます。

ポイントは、

  • zipファイルを圧縮するときは、zipfileをimportしてzipfile.ZipFileを使用する
  • zipフォルダを圧縮する場合は、shutilをimportしてshutil.make_archiveを使用する
  • zipファイルを展開するときは、zipfileをimportしてzipfile.ZipFileを使用する
  • extractall(展開先のパス)で展開する。

Pythonでzipファイルの圧縮

Pythonでzipファイルを圧縮するときは、zipfileをインポートして使います。

import zipfile

Pythonで個別ファイルを圧縮

個別のファイルを圧縮する場合、zipfile.ZipFileで圧縮ファイル名を指定して、zf.writeで圧縮したファイルを適時指定していきます。以下のサンプルでは、test1.txtとtest2.txtというtxtファイルtest3.xlsxというxlsxファイルをtest.zipというファイル名で圧縮しています。第2引数の編集モード’w’は、書き込みを表しています。

編集モード(第2引数)

編集モード内容
書き込み
r読み取り
a追記
ZipFileの編集モード

圧縮タイプ(第3引数)

第3引数は圧縮タイプを指定することができます。

compression内容
zipfile.ZIP_STOREDまとめるのみ(圧縮しない)
zipfile.ZIP_DEFLATEDZIP圧縮
zipfile.ZIP_BZIP2BZIP2圧縮
zipfile.ZIP_LZMALZMA圧縮
圧縮タイプの指定

txtファイルだけではなくxlsxファイルも圧縮できます。

import zipfile
with zipfile.ZipFile('test.zip', 'w',zipfile.ZIP_DEFLATED)as zf:
    zf.write('test1.txt')
    zf.write('test2.txt')
    zf.write('test3.xlsx')

既に存在してるZIPファイルに圧縮するファイルを追加する。

編集モードを’a’にすると既存のZIPファイルに追加して圧縮することもできます。

以下のサンプルは上で作成したtest.zipにtest4.xlsxというエクセルファイルを追加しています。

import zipfile
with zipfile.ZipFile('test.zip', 'a')as zf:
    zf.write('test4.xlsx')

サンプルプログラムを実行するとtest4.xlsxがtest.zipに追加されます。

フォルダごとzip形式で圧縮したい

指定したフォルダごと圧縮したい場合は、shutilライブラリをimportして、shutil.make_archive関数を使用します。

import shutil
shutil.make_archive(圧縮後ファイル名,圧縮形式,root_dir=対象ディレクトリ)

shutil.make_archive

第1引数には、圧縮完了後のファイル名を入れます。※拡張子は省略します。

第2引数には、圧縮形式を入れます。‘zip’以外にも以下の圧縮形式を指定することができます。

圧縮形式内容
zipZIP
tartar
gztargzipで圧縮されたtar(tar.gz)
bztarbzip2で圧縮されたtar(tar.bz2)
xztarxzで圧縮されたtar(tar.xz)

第3引数には、任意のroot_dirで圧縮する対象ディレクトリを指定しています。

以下のサンプルコードは、testフォルダ配下のフォルダ丸ごとをzip形式で圧縮して圧縮後は、archive.zipとして保存しています。

import shutil
shutil.make_archive('archive','zip',root_dir='test')

ZIPファイルを展開する

展開する場合は、extractallでフォルダ配下のすべてのファイルを展開します。
特定のファイルのみを展開する場合はextractでファイルを指定することも可能です。

import zipfile
with zipfile.ZipFile('archive.zip', 'r')as zf:
    zf.extractall(r'.\output')

パスワード付きZIPファイルを展開する

extractallextractの引数オプションpwdでパスワードを指定すると、パスワード付きzipfileを展開することが可能です。※パスワードにpasswordが

import zipfile
with zipfile.ZipFile('archive.zip', 'r')as zf:
zf.extractall(r'.\output',pwd=b 'password')

まとめ

パソコン操作の自動化などで圧縮や展開は、結構使う便利なライブラリです。

  • zipファイルを圧縮するときは、zipfileをimportしてzipfile.ZipFileを使用する
  • zipフォルダを圧縮する場合は、shutilをimportしてshutil.make_archiveを使用する
  • zipファイルを展開するときは、zipfileをimportしてzipfile.ZipFileを使用する
  • extractall(展開先のパス)で展開する。

コメント

タイトルとURLをコピーしました