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.zip
とfile2.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ファイルの一括解凍など、様々な使用方法があります。