【Python】zipを解凍してフォルダに展開する方法

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

基本的な使い方から、エラーハンドリング、応用的なテクニックまで、初心者でも理解できるように具体的なコード例を交えて説明します。

目次から探す

zipファイルの解凍方法

Pythonでは、zipファイルを解凍するための便利なモジュールがいくつか用意されています。

ここでは、標準ライブラリであるzipfileモジュールとshutilモジュールを使った解凍方法について詳しく解説します。

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

zipfile.ZipFileクラスの基本

zipfileモジュールは、Python標準ライブラリの一部であり、zipファイルの読み書きを行うためのクラスやメソッドが提供されています。

その中でも、zipfile.ZipFileクラスは、zipファイルを操作するための基本的なクラスです。

zipfile.ZipFileクラスを使うことで、zipファイルの内容をリスト表示したり、特定のファイルを抽出したり、全てのファイルを解凍することができます。

以下は、zipfile.ZipFileクラスの基本的な使い方の例です。

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

extractallメソッドを使った解凍

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

以下は、extractallメソッドを使った解凍の例です。

import zipfile
# zipファイルを読み込みモードで開く
with zipfile.ZipFile('example.zip', 'r') as zip_ref:
    # 全てのファイルを指定したディレクトリに解凍
    zip_ref.extractall('extracted_files')

このコードを実行すると、example.zip内の全てのファイルがextracted_filesディレクトリに解凍されます。

shutilモジュールを使った解凍(オプション)

shutil.unpack_archive関数の基本

shutilモジュールもPython標準ライブラリの一部であり、ファイル操作に関する様々な機能が提供されています。

その中でも、shutil.unpack_archive関数を使うと、zipファイルを簡単に解凍することができます。

shutil.unpack_archive関数は、アーカイブファイル(zipファイルやtarファイルなど)を指定したディレクトリに解凍するための関数です。

以下は、shutil.unpack_archive関数を使った解凍の例です。

import shutil
# zipファイルを指定したディレクトリに解凍
shutil.unpack_archive('example.zip', 'extracted_files')

このコードを実行すると、example.zip内の全てのファイルがextracted_filesディレクトリに解凍されます。

shutil.unpack_archive関数は、ファイル形式を自動的に判別して解凍するため、zipファイル以外のアーカイブ形式にも対応しています。

以上が、Pythonを使ったzipファイルの解凍方法の基本的な解説です。

次のセクションでは、実際のコード例を使ってさらに詳しく解説していきます。

実際のコード例

ここでは、実際にPythonのコードを使ってzipファイルを解凍する方法を具体的に説明します。

まずは、標準ライブラリであるzipfileモジュールを使った方法から見ていきましょう。

zipfileモジュールを使ったコード例

単純な解凍

まずは、最も基本的なzipファイルの解凍方法を見てみましょう。

以下のコードは、指定したzipファイルを現在のディレクトリに解凍する例です。

import zipfile
# 解凍するzipファイルのパス
zip_file_path = 'example.zip'
# zipファイルを開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # 全てのファイルを解凍する
    zip_ref.extractall()

このコードでは、zipfile.ZipFileクラスを使ってzipファイルを開き、extractallメソッドを使って全てのファイルを解凍しています。

with文を使うことで、zipファイルのクローズ処理を自動的に行います。

解凍先フォルダの指定

次に、解凍先のフォルダを指定する方法を見てみましょう。

以下のコードは、指定したフォルダにzipファイルを解凍する例です。

import zipfile
# 解凍するzipファイルのパス
zip_file_path = 'example.zip'
# 解凍先のフォルダ
extract_to_path = 'extracted_files'
# zipファイルを開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # 指定したフォルダに全てのファイルを解凍する
    zip_ref.extractall(extract_to_path)

このコードでは、extractallメソッドの引数に解凍先のフォルダパスを指定しています。

これにより、指定したフォルダに全てのファイルが解凍されます。

shutilモジュールを使ったコード例(オプション)

shutilモジュールを使ってzipファイルを解凍する方法もあります。

こちらは、より簡潔なコードで解凍を行うことができます。

単純な解凍

まずは、最も基本的なzipファイルの解凍方法を見てみましょう。

以下のコードは、指定したzipファイルを現在のディレクトリに解凍する例です。

import shutil
# 解凍するzipファイルのパス
zip_file_path = 'example.zip'
# zipファイルを解凍する
shutil.unpack_archive(zip_file_path)

このコードでは、shutil.unpack_archive関数を使ってzipファイルを解凍しています。

unpack_archive関数は、ファイルの種類を自動的に判別して解凍を行います。

解凍先フォルダの指定

次に、解凍先のフォルダを指定する方法を見てみましょう。

以下のコードは、指定したフォルダにzipファイルを解凍する例です。

import shutil
# 解凍するzipファイルのパス
zip_file_path = 'example.zip'
# 解凍先のフォルダ
extract_to_path = 'extracted_files'
# zipファイルを解凍する
shutil.unpack_archive(zip_file_path, extract_to_path)

このコードでは、unpack_archive関数の第二引数に解凍先のフォルダパスを指定しています。

これにより、指定したフォルダに全てのファイルが解凍されます。

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

次に、エラーハンドリングについて説明します。

エラーハンドリング

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

これらのエラーを適切に処理することで、プログラムの信頼性とユーザー体験を向上させることができます。

以下では、代表的なエラーとその対処方法について解説します。

ファイルが存在しない場合の対処

まず、解凍しようとしているzipファイルが存在しない場合のエラーハンドリングについて説明します。

この場合、FileNotFoundErrorが発生します。

このエラーをキャッチして適切に対処する方法を見てみましょう。

import zipfile
zip_file_path = 'example.zip'
try:
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
        zip_ref.extractall('extracted_folder')
except FileNotFoundError:
    print(f"Error: {zip_file_path} が見つかりません。ファイルパスを確認してください。")

このコードでは、FileNotFoundErrorが発生した場合にエラーメッセージを表示し、ユーザーにファイルパスを確認するよう促しています。

解凍先フォルダが存在しない場合の対処

次に、解凍先フォルダが存在しない場合の対処方法について説明します。

この場合、FileNotFoundErrorが発生することはありませんが、解凍先フォルダが存在しないと解凍が失敗する可能性があります。

解凍先フォルダが存在しない場合は、自動的に作成するようにしましょう。

import zipfile
import os
zip_file_path = 'example.zip'
extract_to_path = 'extracted_folder'
# 解凍先フォルダが存在しない場合は作成する
if not os.path.exists(extract_to_path):
    os.makedirs(extract_to_path)
try:
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
        zip_ref.extractall(extract_to_path)
except FileNotFoundError:
    print(f"Error: {zip_file_path} が見つかりません。ファイルパスを確認してください。")

このコードでは、os.makedirsを使って解凍先フォルダが存在しない場合に自動的に作成しています。

その他の一般的なエラー

最後に、その他の一般的なエラーについて説明します。

例えば、zipファイルが破損している場合や、解凍中に予期しないエラーが発生する場合があります。

これらのエラーをキャッチして適切に対処する方法を見てみましょう。

import zipfile
import os
zip_file_path = 'example.zip'
extract_to_path = 'extracted_folder'
# 解凍先フォルダが存在しない場合は作成する
if not os.path.exists(extract_to_path):
    os.makedirs(extract_to_path)
try:
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
        zip_ref.extractall(extract_to_path)
except zipfile.BadZipFile:
    print(f"Error: {zip_file_path} は有効なzipファイルではありません。")
except Exception as e:
    print(f"予期しないエラーが発生しました: {e}")

このコードでは、zipfile.BadZipFileをキャッチして、zipファイルが破損している場合のエラーメッセージを表示しています。

また、Exceptionをキャッチして、その他の予期しないエラーが発生した場合にも対応しています。

これらのエラーハンドリングを実装することで、zipファイルの解凍処理がより堅牢になり、ユーザーにとっても使いやすいプログラムを作成することができます。

応用例

ここでは、zipファイルの解凍に関する応用的なテクニックを紹介します。

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

複数のzipファイルを一括解凍

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

以下にその例を示します。

import os
import zipfile
# 解凍するzipファイルが格納されているディレクトリ
zip_dir = 'path/to/zip_files'
# 解凍先のディレクトリ
extract_dir = 'path/to/extracted_files'
# zipファイルを一括で解凍
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} を解凍しました')

このコードでは、指定したディレクトリ内のすべてのzipファイルを一括で解凍し、指定した解凍先ディレクトリに展開します。

特定のファイルのみを解凍

zipファイル内の特定のファイルのみを解凍したい場合、zipfileモジュールのextractメソッドを使用します。

以下にその例を示します。

import zipfile
# 解凍するzipファイルのパス
zip_path = 'path/to/your_file.zip'
# 解凍先のディレクトリ
extract_dir = 'path/to/extracted_files'
# 解凍したい特定のファイル
specific_files = ['file1.txt', 'file2.txt']
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
    for file in specific_files:
        zip_ref.extract(file, extract_dir)
        print(f'{file} を解凍しました')

このコードでは、指定したzipファイル内の特定のファイルのみを解凍し、指定した解凍先ディレクトリに展開します。

解凍後のファイル操作(例: ファイルの移動や削除)

解凍後にファイルを移動したり削除したりする場合、shutilモジュールやosモジュールを使用します。

以下にその例を示します。

import os
import shutil
import zipfile
# 解凍するzipファイルのパス
zip_path = 'path/to/your_file.zip'
# 一時的な解凍先のディレクトリ
temp_extract_dir = 'path/to/temp_extracted_files'
# 最終的な移動先のディレクトリ
final_dir = 'path/to/final_destination'
# zipファイルを一時的なディレクトリに解凍
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
    zip_ref.extractall(temp_extract_dir)
# 解凍後のファイルを移動
for filename in os.listdir(temp_extract_dir):
    src_path = os.path.join(temp_extract_dir, filename)
    dst_path = os.path.join(final_dir, filename)
    shutil.move(src_path, dst_path)
    print(f'{filename} を {final_dir} に移動しました')
# 一時的な解凍先のディレクトリを削除
shutil.rmtree(temp_extract_dir)
print(f'{temp_extract_dir} を削除しました')

このコードでは、zipファイルを一時的なディレクトリに解凍し、その後ファイルを最終的な移動先に移動します。

最後に、一時的な解凍先のディレクトリを削除します。

これらの応用例を活用することで、より柔軟にzipファイルの解凍とその後のファイル操作を行うことができます。

目次から探す