Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonのzipfileモジュールでZIPアーカイブを操作する方法

ZIP形式は、複数のファイルをまとめるアーカイブと圧縮の両方に使える、最も広く普及しているファイル形式のひとつです。MS-DOSの時代から長く使われており、有名なPKZIPアプリケーションでも採用されてきました。

Pythonの標準ライブラリに含まれるzipfileモジュールは、ZIPアーカイブの作成・展開・読み込み・書き込みを簡単に行うためのクラスを提供しています。この記事では、zipfileモジュールの基本的な使い方をコード例とともに解説します。

ZipFile()でアーカイブを開く

ZipFile()関数は、第1引数に指定したファイルからZipFileオブジェクトを返します。ファイル名は文字列でも、組み込みのopen()関数で作成したファイルオブジェクトでも構いません。

第2引数のmodeには、読み込みモード「r」(デフォルト値)、書き込みモード「w」、追記モード「a」のいずれかを指定できます。

デフォルトではアーカイブは圧縮されません。圧縮アルゴリズムを指定したい場合は、compressionパラメータに以下の定数のいずれかを設定します。

zipfile.ZIP_STORED圧縮しない(無圧縮)でアーカイブに格納します。
zipfile.ZIP_DEFLATED一般的なZIP圧縮方式を使用します。zlibモジュールが必要です。
zipfile.ZIP_BZIP2BZIP2圧縮方式を使用します。bz2モジュールが必要です。
zipfile.ZIP_LZMALZMA圧縮方式を使用します。lzmaモジュールが必要です。

ZipFileオブジェクトの主なメソッド

write() — ファイルをアーカイブに追加する

このメソッドは、ZipFileオブジェクトが表すアーカイブにファイルを追加します。

>>> import zipfile
>>> newzip=zipfile.ZipFile('newdir/newzip.zip','w')
>>> newzip.write('zen.txt')
>>> newzip.close()

既存のアーカイブにファイルを追加する場合は、modeを「a」(追記モード)として開きます。

>>> newzip=zipfile.ZipFile('newdir/newzip.zip','a')
>>> newzip.write('zen.txt')
>>> newzip.close()

read() — アーカイブ内のファイルを読み込む

このメソッドは、アーカイブ内の特定のファイルからデータを読み取ります。

>>> newzip=zipfile.ZipFile('newdir/newzip.zip','r')
>>> data=newzip.read('json.txt')
>>> data
b'["Rakesh", {"marks": [50, 60, 70]}]'

printdir() — アーカイブ内容の一覧を表示する

このメソッドは、アーカイブに含まれるすべてのファイルを一覧表示します。

>>> newzip.printdir()
File Name    Modified           Size
json.txt     2018-11-2717:04:40    35
zen.txt      2018-11-2523:13:44    878

extract() — 指定したファイルを取り出す

このメソッドは、アーカイブから指定したファイルを展開します。デフォルトではカレントディレクトリに展開されますが、第2引数で別の出力先ディレクトリを指定することもできます。

>>> newzip.extract('json.txt','newdir')
'newdir\\json.txt'

extractall() — すべてのファイルを展開する

このメソッドは、アーカイブ内のすべてのファイルをデフォルトでカレントディレクトリに展開します。必要に応じて、出力先ディレクトリを引数として指定してください。

>>> newzip.extractall('newdir')

getinfo() — ファイルのメタデータを取得する

このメソッドは、指定したファイルに対応するZipInfoオブジェクトを返します。ZipInfoオブジェクトには、ファイルに関するさまざまなメタデータが格納されています。

次のコードでは、アーカイブから「zen.txt」のZipInfoオブジェクトを取得し、ファイル名・サイズ・日時情報を取り出しています。

>>> inf = newzip.getinfo('zen.txt')
>>> inf.filename,inf.file_size, inf.date_time
('zen.txt', 878, (2018, 11, 25, 23, 13, 45))

infolist() — 全ファイルのZipInfoを取得する

このメソッドは、アーカイブ内のすべてのファイルに対応するZipInfoオブジェクトのリストを返します。

>>> newzip.infolist()
[<ZipInfo filename = 'json.txt' filemode='-rw-rw-rw-' file_size=35>, <ZipInfo filename = 'zen.txt' filemode='-rw-rw-rw-' file_size=878>]

前述のとおり、ZIPアーカイブの作成時に適用する圧縮アルゴリズムはcompressionパラメータで指定します。次のコードでは、ZIP_DEFLATED定数を指定してzlib圧縮によるアーカイブを作成しています。

>>> zipobj = zipfile.ZipFile('txtzip.zip',mode='w', compression=zipfile.ZIP_DEFLATED)
>>> files=glob.glob("*.txt")
>>> for file in files:
zipobj.write(file)
>>> zipobj.close()

namelist() — ファイル名の一覧を取得する

ZipFileオブジェクトのこのメソッドは、アーカイブ内の全ファイル名のリストを返します。

>>> zipobj = zipfile.ZipFile('txtzip.zip',mode='r')
>>> zipobj.namelist()
['a!.txt', 'data().txt', 'dict.txt', 'json.txt', 'LICENSE.txt', 'lines.txt', 'msg.txt', 'NEWS.txt', 'test.txt/', 'zen.txt', 'zen1.txt', 'zenbak.txt']

setpassword() — パスワードを設定する

このメソッドは、アーカイブを展開する際に必要となるパスワードを設定します。パスワードで保護されたZIPファイルを扱う場合に使用します。

PyZipFile()でPythonモジュールをアーカイブする

zipfileモジュールのPyZipFile()関数は、PyZipFileオブジェクトを返します。PyZipFileオブジェクトを使うと、拡張子.pyのファイルを含むアーカイブを作成できます。このアーカイブをsys.path環境変数に追加すれば、zipimportモジュールを使ってモジュールとしてインポートできるようになります。

writepy()メソッドは、.pyファイルをコンパイルして対応する.pycファイルにした上で、アーカイブに追加します。

files=glob.glob("*.py")
>>> pyzipobj = zipfile.PyZipFile('pyfiles/pyzip.zip', mode='w', compression=zipfile.ZIP_LZMA)
>>> for file in files:
pyzipobj.writepy(file)
>>> pyzipobj.close()

この記事では、zipfileモジュールで利用できるクラスと関数について解説しました。これらを活用することで、PythonスクリプトからZIPアーカイブを柔軟かつ効率的に操作できます。

  1. PythonのBokehで画像を操作・表示する方法

    Pythonの可視化ライブラリBokehで画像を扱うには、image_url()メソッドを使い、画像URLのリストを渡すのが基本です。このメソッドを使うことで、ローカルやWeb上にある画像をプロット領域内に簡単に配置できます。実装の手順output_file()でデフォルトの出力先を設定し、show()を呼び出したときに結果がHTMLファイルとして保存されるようにします。figure()でプロット用の新しいFigure(図)オブジェクトを作成します。image_url()メソッドで、指定したURLから読み込んだ画像を描画します。show()を呼び出して、Bokehオブジェクトやアプリケーション

  2. PythonのPygameで画像を表示する方法

    Pygameは、Pythonでゲームやマルチメディアアプリケーションを開発するための定番マルチメディアライブラリです。本記事では、pygameモジュールを使用して、画像のサイズ(高さ・幅)やウィンドウ内での表示位置を考慮しながら、画面に画像を描画する方法を解説します。 画像表示の基本的な流れ 以下のサンプルプログラムでは、まずpygameモジュールを初期化し、ウィンドウのサイズとキャプション(タイトルバーの文字列)を設定します。その後、画像ファイルを読み込み、表示する座標を指定します。screen.blit()関数が実際に画面へ画像を描画し、whileループがウィンドウを閉じる操作(QUITイ