【Python】zipファイルを解凍する方法

この記事では、Pythonの標準ライブラリであるzipfileモジュールと、AES暗号化に対応したpyzipperモジュールを使って、zipファイルを解凍する方法をわかりやすく解説します。

基本的な解凍手順から、特定のファイルの解凍、パスワード付きzipファイルの解凍方法、エラーハンドリング、そして実践的なスクリプトの例まで、初心者でも理解できるように丁寧に説明します。

目次から探す

zipfileモジュールを使った解凍方法

Pythonには標準ライブラリとしてzipfileモジュールが用意されており、これを使うことで簡単にzipファイルを解凍することができます。

このセクションでは、zipfileモジュールを使った基本的な解凍手順から、特定のファイルの解凍、パスワード付きzipファイルの解凍方法までを詳しく解説します。

基本的な解凍手順

ZipFileクラスの使用

まずは、zipfileモジュールの基本的な使い方を見ていきましょう。

ZipFileクラスを使うことで、zipファイルを開くことができます。

import zipfile
# zipファイルのパスを指定
zip_file_path = 'example.zip'
# ZipFileクラスを使ってzipファイルを開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # zipファイルの内容を表示
    print(zip_ref.namelist())

このコードでは、example.zipというzipファイルを開き、その中に含まれるファイルのリストを表示しています。

with文を使うことで、ファイルを自動的に閉じることができます。

extractallメソッドの使用

次に、zipファイルを解凍する方法を見ていきましょう。

extractallメソッドを使うことで、zipファイル内のすべてのファイルを指定したディレクトリに解凍することができます。

import zipfile
# zipファイルのパスを指定
zip_file_path = 'example.zip'
# 解凍先のディレクトリを指定
extract_to_path = 'extracted_files'
# ZipFileクラスを使ってzipファイルを開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # zipファイルを解凍
    zip_ref.extractall(extract_to_path)

このコードでは、example.zipというzipファイルをextracted_filesというディレクトリに解凍しています。

extractallメソッドを使うことで、簡単にすべてのファイルを解凍することができます。

特定のファイルを解凍する方法

extractメソッドの使用

zipファイル内の特定のファイルだけを解凍したい場合は、extractメソッドを使います。

extractメソッドは、解凍したいファイル名を引数に取ります。

import zipfile
# zipファイルのパスを指定
zip_file_path = 'example.zip'
# 解凍先のディレクトリを指定
extract_to_path = 'extracted_files'
# 解凍したいファイル名を指定
file_to_extract = 'document.txt'
# ZipFileクラスを使ってzipファイルを開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # 特定のファイルを解凍
    zip_ref.extract(file_to_extract, extract_to_path)

このコードでは、example.zipというzipファイル内のdocument.txtというファイルだけをextracted_filesというディレクトリに解凍しています。

パスワード付きzipファイルの解凍

setpasswordメソッドの使用

パスワード付きのzipファイルを解凍する場合は、setpasswordメソッドを使います。

パスワードはバイト文字列で指定する必要があります。

import zipfile
# zipファイルのパスを指定
zip_file_path = 'example_protected.zip'
# 解凍先のディレクトリを指定
extract_to_path = 'extracted_files'
# パスワードを指定
password = b'secret'
# ZipFileクラスを使ってzipファイルを開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # パスワードを設定
    zip_ref.setpassword(password)
    # zipファイルを解凍
    zip_ref.extractall(extract_to_path)

このコードでは、example_protected.zipというパスワード付きのzipファイルをextracted_filesというディレクトリに解凍しています。

パスワードはb'secret'というバイト文字列で指定しています。

以上が、zipfileモジュールを使ったzipファイルの解凍方法です。

基本的な使い方から特定のファイルの解凍、パスワード付きzipファイルの解凍までを網羅しました。

これらの方法を使って、さまざまなシチュエーションでzipファイルを扱うことができるようになります。

pyzipperモジュールを使った解凍方法

pyzipperは、PythonでAES暗号化されたzipファイルを扱うためのモジュールです。

標準ライブラリのzipfileモジュールでは対応していないAES暗号化に対応しているため、セキュリティが強化されたzipファイルを扱う際に便利です。

pyzipperのインストール

まず、pyzipperをインストールする必要があります。

以下のコマンドを使用してインストールします。

pip install pyzipper

基本的な解凍手順

pyzipperを使ってzipファイルを解凍する基本的な手順を見ていきましょう。

AESZipFileクラスの使用

pyzipperでは、AESZipFileクラスを使用してzipファイルを操作します。

以下は、AESZipFileクラスを使ってzipファイルを開く例です。

import pyzipper
# zipファイルを開く
with pyzipper.AESZipFile('example.zip', 'r') as zip_file:
    # ファイルのリストを表示
    print(zip_file.namelist())

extractallメソッドの使用

extractallメソッドを使用すると、zipファイル内のすべてのファイルを指定したディレクトリに解凍できます。

以下はその例です。

import pyzipper
# zipファイルを開く
with pyzipper.AESZipFile('example.zip', 'r') as zip_file:
    # すべてのファイルを解凍
    zip_file.extractall('output_directory')

パスワード付きzipファイルの解凍

パスワード付きのzipファイルを解凍する場合、setpasswordメソッドを使用してパスワードを設定します。

setpasswordメソッドの使用

以下は、パスワード付きのzipファイルを解凍する例です。

import pyzipper
# zipファイルを開く
with pyzipper.AESZipFile('example.zip', 'r') as zip_file:
    # パスワードを設定
    zip_file.setpassword(b'my_password')
    # すべてのファイルを解凍
    zip_file.extractall('output_directory')

このようにして、pyzipperを使用してAES暗号化されたzipファイルやパスワード付きのzipファイルを簡単に解凍することができます。

pyzipperは、セキュリティが強化されたzipファイルを扱う際に非常に便利なツールです。

エラーハンドリング

Pythonでzipファイルを解凍する際には、いくつかのエラーが発生する可能性があります。

これらのエラーに対処するためには、適切なエラーハンドリングが必要です。

ここでは、一般的なエラーとその対処法、そして例外処理の実装方法について解説します。

一般的なエラーとその対処法

ファイルが見つからないエラー

ファイルが見つからないエラーは、指定したzipファイルが存在しない場合に発生します。

このエラーは、FileNotFoundError例外としてキャッチされます。

以下のコードは、このエラーをキャッチして適切に対処する方法を示しています。

import zipfile
try:
    with zipfile.ZipFile('non_existent_file.zip', 'r') as zip_ref:
        zip_ref.extractall('extracted_files')
except FileNotFoundError:
    print("指定されたファイルが見つかりません。ファイル名を確認してください。")

パスワードが間違っているエラー

パスワード付きのzipファイルを解凍する際に、パスワードが間違っている場合はRuntimeErrorが発生します。

このエラーも適切にキャッチして対処する必要があります。

import zipfile
try:
    with zipfile.ZipFile('password_protected.zip', 'r') as zip_ref:
        zip_ref.setpassword(b'wrong_password')
        zip_ref.extractall('extracted_files')
except RuntimeError:
    print("パスワードが間違っています。正しいパスワードを入力してください。")

例外処理の実装

例外処理を実装することで、プログラムが予期しないエラーでクラッシュするのを防ぎ、ユーザーに適切なフィードバックを提供することができます。

Pythonでは、try-exceptブロックを使用して例外処理を行います。

try-exceptブロックの使用

try-exceptブロックを使用することで、特定のコードブロックで発生する可能性のあるエラーをキャッチし、適切に対処することができます。

以下は、try-exceptブロックを使用してzipファイルの解凍を行う例です。

import zipfile
try:
    with zipfile.ZipFile('example.zip', 'r') as zip_ref:
        zip_ref.extractall('extracted_files')
except FileNotFoundError:
    print("指定されたファイルが見つかりません。ファイル名を確認してください。")
except RuntimeError:
    print("パスワードが間違っています。正しいパスワードを入力してください。")
except zipfile.BadZipFile:
    print("zipファイルが壊れています。別のファイルを試してください。")
except Exception as e:
    print(f"予期しないエラーが発生しました: {e}")

この例では、FileNotFoundErrorRuntimeErrorzipfile.BadZipFileの各例外をキャッチして適切に対処しています。

また、Exceptionクラスを使用して、その他の予期しないエラーもキャッチしています。

エラーハンドリングを適切に行うことで、プログラムの信頼性とユーザーエクスペリエンスを向上させることができます。

実践例

ここでは、実際にPythonを使ってzipファイルを解凍する具体的なスクリプトを紹介します。

特に、複数のzipファイルを一括で解凍する方法や、解凍後のファイル操作について詳しく解説します。

複数のzipファイルを一括解凍するスクリプト

複数のzipファイルを一括で解凍する場合、Pythonのosモジュールとzipfileモジュールを組み合わせて使用します。

以下のスクリプトは、指定したディレクトリ内のすべてのzipファイルを一括で解凍する方法を示しています。

import os
import zipfile
# 解凍するzipファイルが格納されているディレクトリ
zip_dir = 'path/to/zip/files'
# 解凍先のディレクトリ
extract_dir = 'path/to/extract/files'
# ディレクトリ内のすべてのファイルを取得
for filename in os.listdir(zip_dir):
    if filename.endswith('.zip'):
        zip_path = os.path.join(zip_dir, filename)
        with zipfile.ZipFile(zip_path, 'r') as zip_ref:
            zip_ref.extractall(extract_dir)
        print(f'{filename} を解凍しました')

このスクリプトでは、まずos.listdirを使って指定したディレクトリ内のすべてのファイルを取得し、拡張子が.zipのファイルを見つけます。

次に、zipfile.ZipFileを使って各zipファイルを解凍し、指定したディレクトリに展開します。

解凍後のファイル操作

解凍後のファイル操作も重要です。

ここでは、解凍したファイルのリストを取得する方法と、解凍したファイルを移動や削除する方法について説明します。

解凍したファイルのリストを取得

解凍したファイルのリストを取得するには、osモジュールを使います。

以下のスクリプトは、指定したディレクトリ内のすべてのファイルとディレクトリをリストアップします。

import os
# 解凍先のディレクトリ
extract_dir = 'path/to/extract/files'
# ディレクトリ内のすべてのファイルとディレクトリを取得
for root, dirs, files in os.walk(extract_dir):
    for file in files:
        print(os.path.join(root, file))

このスクリプトでは、os.walkを使って指定したディレクトリ内のすべてのファイルとディレクトリを再帰的に取得し、各ファイルのパスを出力します。

解凍したファイルの移動や削除

解凍したファイルを移動や削除するには、shutilモジュールを使います。

以下のスクリプトは、解凍したファイルを別のディレクトリに移動し、元のファイルを削除する方法を示しています。

import os
import shutil
# 解凍先のディレクトリ
extract_dir = 'path/to/extract/files'
# 移動先のディレクトリ
move_dir = 'path/to/move/files'
# ディレクトリ内のすべてのファイルを移動
for root, dirs, files in os.walk(extract_dir):
    for file in files:
        file_path = os.path.join(root, file)
        shutil.move(file_path, move_dir)
        print(f'{file} を {move_dir} に移動しました')
# 元のディレクトリを削除
shutil.rmtree(extract_dir)
print(f'{extract_dir} を削除しました')

このスクリプトでは、まずos.walkを使って解凍先のディレクトリ内のすべてのファイルを取得し、shutil.moveを使って各ファイルを移動先のディレクトリに移動します。

最後に、shutil.rmtreeを使って元のディレクトリを削除します。

これらのスクリプトを活用することで、Pythonを使ったzipファイルの解凍とその後のファイル操作が簡単に行えるようになります。

ぜひ試してみてください。

目次から探す