スポンサーリンク

【Python】zipfileモジュールによる圧縮・解凍

記事内に広告が含まれています。

Python標準ライブラリのzipfileモジュールは、ZIPファイルの作成や解凍を簡単に行うための便利なツールです。

複数のZIPファイルをまとめて解凍したり、特定のファイルだけを解凍したり、複数のファイルやディレクトリをZIPファイルに圧縮することができます。

zipfileモジュールの使い方をサンプルコードとともにまとめます。

スポンサーリンク

基本的なZIPファイルの解凍

まず、基本的なZIPファイルの解凍です。

以下のコードは、1つのZIPファイルを指定のディレクトリに解凍するシンプルな例です。

import zipfile
import os

# ZIPファイルのパスと解凍先のディレクトリを指定
zip_file_path = 'example.zip'
output_dir = 'output_directory'

# 解凍先ディレクトリが存在しない場合は作成
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# ZIPファイルを解凍
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    zip_ref.extractall(output_dir)

print(f'{zip_file_path} を {output_dir} に解凍しました。')

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

解凍先ディレクトリが存在しない場合は、os.makedirs()で新しく作成します。

スポンサーリンク

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

次に、指定されたフォルダに存在するすべてのZIPファイルを一括で解凍する方法を見てみましょう。

大量のZIPファイルを扱う場合に便利です。

import zipfile
import os

# ZIPファイルが保存されているフォルダ
zip_folder = 'zip_files'
# すべてのZIPファイルを解凍するフォルダ
output_dir = 'unzipped_files'

# 解凍先ディレクトリが存在しない場合は作成
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# ZIPフォルダ内のすべてのZIPファイルを解凍
for file_name in os.listdir(zip_folder):
    if file_name.endswith('.zip'):
        zip_file_path = os.path.join(zip_folder, file_name)
        with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
            # 各ZIPファイルを個別のディレクトリに解凍
            extract_dir = os.path.join(output_dir, os.path.splitext(file_name)[0])
            if not os.path.exists(extract_dir):
                os.makedirs(extract_dir)
            zip_ref.extractall(extract_dir)
            print(f'{file_name} を {extract_dir} に解凍しました。')

このスクリプトでは、指定フォルダ内のすべてのZIPファイルをループで処理し、それぞれを個別のフォルダに解凍します。

例えば、file1.zipfile2.zipがある場合、それぞれunzipped_files/file1/unzipped_files/file2/に解凍されます。

特定のファイルだけを解凍

ZIPファイルの中から、特定のファイルだけを解凍する場合もあります。たとえば、特定の画像ファイルだけを取り出したい場合には、以下のコードのように処理できます。

import osimport zipfile
# ZIPファイルのパス
zip_file_path = 'example.zip'
# 解凍先ディレクトリ
output_dir = 'images_output'

# 解凍先ディレクトリが存在しない場合は作成
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# ZIPファイル内の特定のファイルのみ解凍
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    for file_name in zip_ref.namelist():
        if file_name.endswith('.png') or file_name.endswith('.jpg'):
            zip_ref.extract(file_name, output_dir)
            print(f'{file_name} を {output_dir} に解凍しました。')

このコードでは、ZIPファイル内の画像ファイル(.png.jpg)だけを抽出しています。

namelist()メソッドを使ってZIPファイル内のファイル一覧を取得し、特定の拡張子のファイルのみをextract()で解凍します。

ファイルをZIPファイルに圧縮する

次は、複数のファイルやディレクトリをZIPファイルに圧縮する方法です。

以下のコードでは、指定されたフォルダ内の全ファイルをZIPファイルに圧縮します。

import zipfile
import os

# 圧縮したいフォルダ
folder_to_zip = 'files_to_zip'
# 出力するZIPファイルの名前
output_zip = 'compressed_files.zip'

# ZIPファイルを作成
with zipfile.ZipFile(output_zip, 'w') as zipf:
    for root, dirs, files in os.walk(folder_to_zip):
        for file in files:
            file_path = os.path.join(root, file)
            arcname = os.path.relpath(file_path, folder_to_zip)
            zipf.write(file_path, arcname)
            print(f'{file} をZIPに追加しました。')

print(f'{folder_to_zip} を {output_zip} に圧縮しました。')

このスクリプトでは、os.walk()を使用してディレクトリを再帰的に処理し、全てのファイルをZIPファイルに追加します。arcnameは、ファイルをZIPに格納する際の相対パスです。

ZIPファイルの内容を確認する

ZIPファイル内のファイル一覧を取得したい場合、以下のコードで確認できます。

import zipfile

# ZIPファイルのパス
zip_file_path = 'example.zip'

# ZIPファイル内のファイルリストを表示
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    file_list = zip_ref.namelist()
    print(f'{zip_file_path} 内のファイルリスト:')
    for file_name in file_list:
        print(file_name)

このコードでは、namelist()メソッドを使って、ZIPファイル内のすべてのファイルをリスト形式で取得し、表示します。

まとめ

zipfileモジュールは、PythonでZIPファイルを扱うためのモジュールで、解凍、圧縮、複数のZIPファイルの一括解凍など、様々な使用方法があります。

スポンサーリンク
Python
著者SNS
タイトルとURLをコピーしました