Pythonにできることは自動化しよう!【第7回 ZIPファイル】

こんにちは、unogram管理人のうのちゅ〜です。

【Pythonにできることは自動化しよう!】シリーズとして、Pythonの基礎から順を追って学習し、作業の自動化・効率化を実現する能力を身に着けていきます。Pythonの基礎について学ぶだけで、大規模なコードを書かなくても十分に役に立つプログラムを記述することができるようになります。Pythonは気になるけど、プログラミングには苦手意識がある方も安心してトライしてみてください!

本シリーズでは、以下のようなことができるようになります。

  • ファイルの読み書き・管理
  • Webサイトからファイルをダウンロード
  • エクセルシート操作
  • PDF・ワード文書操作・テキスト抽出
  • 電子メール・SMS送信

うまく活用すれば作業に役立ちそうなワードがたくさん並んでいますね!

なお、本シリーズでは一部以下の書籍を参考にしています。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。

それでは見ていきましょう!



ZIPファイルを扱うzipfileモジュール・ZipFileオブジェクト

たくさんのファイルやフォルダをまとめてアップロードしたり、メールで転送する際に、みなさんもよくZIPファイルを利用しているかと思います。ここでは、PythonにおけるZIPファイルの扱いを学習します。

Pythonでは、zipfileモジュールにZIPファイルを扱う関数が含まれているので、ZIPファイルを扱う際は忘れずにインポートしておきましょう。

ZIPファイルの操作には、基本的にZipFileオブジェクトを生成し、各種メソッドを使用して行います。

import zipfile

ZIPファイルの作成・追加を行うwrite()メソッド

ZIPファイルの作成・追加を行うwrite()メソッドを使うと、新しくZIPファイルを作成したり、既存のZIPファイルにファイルを追加することができます。

ZIPファイルの作成

ZIPファイルの作成は、次の手順で行います。

  1. 書き込みモードwzipfile.ZipFile()関数を呼び出してZipFileオブジェクトを作成する
  2. ZipFileオブジェクトのwrite()メソッドに含ませたいファイルのパスを渡す
  3. ZipFileオブジェクトをclose()する

Pythonにできることは自動化しよう!【第5回 ファイルの操作・読み書き】で学習したFileオブジェクトの書き込みに似ていることが分かるのではないかと思います。

次の例では、'ziptest.zipという新しいZIPファイルにtest.pngというファイルを含ませています。compressは圧縮タイプを指定するもので、zipfile.ZIP_DEFLATEDとしています。

ziptest = zipfile.ZipFile('ziptest.zip', 'w')
ziptest.write('test.png',compress_type=zipfile.ZIP_DEFLATED)
ziptest.close()

ZIPファイルへのファイルの追加

また、ZIPファイルへの追加は次の手順で行います。

  1. 追加モードazipfile.ZipFile()関数を呼び出してZipFileオブジェクトを作成する
  2. ZipFileオブジェクトのwrite()メソッドに追加したいファイルのパスを渡す
  3. ZipFileオブジェクトをclose()する
ziptest = zipfile.ZipFile('ziptest.zip', 'a')
ziptest.write('test1.png',compress_type=zipfile.ZIP_DEFLATED)
ziptest.close()

zipfile.ZipFile()関数の便利なメソッド namelist()、getinfo()メソッド

ZIPファイルを読み込む際にも、zipfile.ZipFile()関数を呼び出してZipFileオブジェクトを作成します。このとき、引数を読み込みたいZIPファイルのパスとします。

例として、さきほど作成・追加したZIPファイルziptest.zipを読み込んでみます。

ziptest = zipfile.ZipFile('ziptest.zip')



ここからは、読み込んだZIPファイルの情報を取得するための、ZipFileオブジェクトの便利なメソッドを紹介します。

namelist()メソッド

読み込んだZIPファイルに含まれる全てのファイル・フォルダを文字列のリストとして返します。

ziptest.namelist()
# ['test.png', 'test1.png']

getinfo()メソッド

引数にファイル名を与えると、そのファイルに関するZipInfoオブジェクトを返します。このZipInfoオブジェクトの属性を使うと様々なことが分かるため、非常に便利です。

例えば、元のファイルサイズを表す属性file_sizeと圧縮後のファイルサイズを表すcompress_sizeを使うと、圧縮率を算出することも可能です。

infotest = ziptest.getinfo('test.png')
print(infotest.file_size)
# 17367
print(infotest.compress_size)
# 16541
print('圧縮率: ' + str(infotest.compress_size/infotest.file_size))
# 圧縮率: 0.9524385328496574

ZIPファイルを展開するextractall()メソッド

ZIPファイルの展開もPythonで行うことができます。これには、ZipFileオブジェクトのextractall()メソッドを使います。

  1. 展開したいZIPファイルを引数としてzipfile.ZipFile()関数を呼び出し、ZipFileオブジェクトを作成する
  2. ZipFile.extractall()メソッドで引数に指定した展開先のパスにZIPファイルをすべて展開する(指定しない場合はカレントディレクトリに展開)

ZIPファイルの一部を展開するextract()メソッド

extractall()メソッドではなくextract()メソッドを使用すると、引数に指定した1つのファイルのみを展開することも可能です。

ziptest = zipfile.ZipFile('ziptest.zip')
ziptest.extractall()

参考書の自動化例

本シリーズで参考にしている「退屈なことはPythonにやらせよう」では、次のような応用例にファイル操作・読み書きを利用して、簡単な自動化プログラムを作成しています。今回の学習内容を使うと、以前学習した正規表現と組み合わせた応用も可能です。詳しい内容についてはぜひ書籍を参照してみてください。

  • ZIPファイルへのフォルダバックアップ

まとめ

今回は、【Pythonにできることは自動化しよう!】シリーズ第7回として、PythonにおけるZIPファイルの扱いについて学習しました。Pythonにできることは自動化しよう!【第5回 ファイル操作・読み書き】Pythonにできることは自動化しよう!【第6回 ファイル管理】で学習した内容と合わせて、自動化作業に必要な道具として使いこなせるようにしておきましょう。

追加で詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。

おすすめ参考書

冒頭でも紹介しましたが、Pythonによる自動化に向けた学習は、本シリーズでも参考にしている次の書籍がおすすめです。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。