PythonでZIPファイルを操作する - zipfile

2025-02-09

Python では、ZIP 形式のアーカイブファイルを操作するために、標準ライブラリのzipfileモジュールを使用できます。このモジュールを利用することで、zip コマンドなどを使用せずに、ファイルの圧縮や展開を Python コード内で簡単に行うことが可能です。本記事では、zipfileモジュールの使い方やその応用について詳しく解説します。

1. zipfileモジュールの概要

zipfileモジュールは、ZIP 形式のファイルを圧縮、展開、あるいはその内容を操作するための便利なツールです。特に次のような機能を提供します:

  • ZIP ファイルを読み込む
  • ZIP ファイルにデータを追加する
  • ファイルのリストを取得する
  • ファイルを展開する

これらの機能を活用することで、Python コード内で柔軟なファイル操作を行うことができます。

2. 基本的な使い方

2.1 ZIP ファイルを開く

まず、対象の ZIP ファイルを指定してZipFileオブジェクトを生成します。ファイルモードを指定することで、読み込み、書き込み、追記などの操作を選択できます。

例:ZIP ファイルを開く

import zipfile

# ZIPファイルを読み込みモードで開く
with zipfile.ZipFile('example.zip', 'r') as zip:
    print(zip.namelist())  # ZIPファイル内のファイルリストを表示

2.2 ファイルの圧縮

ファイルを新しい ZIP ファイルに圧縮する場合は、ZipFileオブジェクトを作成し、write()またはwritestr()メソッドを使用します。

例:ファイルを圧縮

with zipfile.ZipFile('example.zip', 'w', zipfile.ZIP_DEFLATED) as zip:
    zip.write('file1.txt')  # ファイルを追加
    zip.writestr('file2.txt', 'このテキストは直接ZIPファイルに追加されました。')

2.3 ファイルの展開

ZIP ファイル内のファイルを展開するには、extract()またはextractall()メソッドを使用します。

例:ファイルを展開

with zipfile.ZipFile('example.zip', 'r') as zip:
    zip.extractall('extracted_files')  # ZIP内の全ファイルを展開

3. ZIP ファイル操作の応用

3.1 ファイルリストの取得

ZIP ファイル内のファイルリストを取得するには、namelist()メソッドを使用します。

例:ファイルリストの取得

with zipfile.ZipFile('example.zip', 'r') as zip:
    print(zip.namelist())  # ファイル名のリストを取得

3.2 特定のファイルを展開

特定のファイルのみを展開する場合は、extract()メソッドを使用します。

例:特定ファイルの展開

with zipfile.ZipFile('example.zip', 'r') as zip:
    zip.extract('file1.txt', 'target_directory')  # file1.txtを特定のディレクトリに展開

3.3 圧縮レベルの調整

圧縮レベルを指定することで、圧縮率を調整することができます。デフォルトではZIP_DEFLATEDが使用されますが、他の圧縮方式も利用可能です。

例:圧縮レベルの設定

with zipfile.ZipFile('example.zip', 'w', compression=zipfile.ZIP_DEFLATED, compresslevel=9) as zip:
    zip.write('file1.txt')

4. よくあるエラーと対処法

4.1 BadZipFile エラー

ZIP 形式でないファイルをZipFileとして開こうとすると、BadZipFile例外が発生します。

対処法

try:
    with zipfile.ZipFile('not_a_zip_file.txt', 'r') as zip:
        pass
except zipfile.BadZipFile:
    print("指定されたファイルは有効なZIPファイルではありません。")

4.2 ファイル操作後のエラー

閉じた ZIP ファイルに対して操作を行おうとすると、ValueError例外が発生します。

対処法

ZIP ファイルを操作する際は、with文を使用して自動的に閉じるようにしましょう。

5. 実用例

5.1 ZIP ファイル内の日本語ファイル名を扱う

ZIP ファイルに日本語ファイル名が含まれている場合、環境依存で文字コードの問題が発生することがあります。その場合、文字コードを指定してデコードすることで対応できます。

例:日本語ファイル名の扱い

with zipfile.ZipFile('sample.zip', 'r') as zip:
    for name in zip.namelist():
        print(name.encode('cp437').decode('utf-8', 'ignore'))

6. 結論

zipfileモジュールは、Python で ZIP 形式のファイルを操作するための強力なツールです。基本的な使い方を理解し、適切な方法でファイルの圧縮や展開を行うことで、効率的なデータ管理が可能になります。ファイルのリスト取得、特定ファイルの展開、圧縮レベルの調整など、多彩な機能を活用してさまざまな用途に対応しましょう。