1. はじめに
Pythonには、標準ライブラリだけでファイルの圧縮・解凍を簡単に行える便利な機能が備わっています。ZIP形式をはじめ、さまざまな形式のファイルをPythonで取り扱うことで、バックアップやログ管理、自動処理の効率化が可能になります。
本記事では、Python初心者〜中級者の方向けに、zipfile
モジュールやshutil
モジュールを使ったファイル圧縮・解凍方法を、コード例と実行結果を交えてわかりやすく解説します。
2. Pythonでファイルを圧縮・解凍する基本
2-1. zipfileモジュールとは?
Pythonの標準ライブラリであるzipfile
モジュールは、ZIPファイルの読み書きを行うための機能が詰まったモジュールです。これを使えば、わざわざ外部ライブラリをインストールせずに、ファイルの圧縮や解凍を行うことができます。
2-2. ファイルをZIP圧縮する方法
import zipfile
# 圧縮対象のファイルと圧縮後のZIPファイル名
file_to_zip = 'sample.txt'
zip_file_name = 'sample.zip'
# ZIPファイルを作成し、ファイルを圧縮
with zipfile.ZipFile(zip_file_name, 'w') as zipf:
zipf.write(file_to_zip)
print(f"{file_to_zip} を {zip_file_name} に圧縮しました")
実行結果:
sample.txt を sample.zip に圧縮しました
2-3. ZIPファイルを解凍する方法
import zipfile
# 解凍するZIPファイル
zip_file_name = 'sample.zip'
# 解凍先ディレクトリ
extract_dir = 'extracted_files'
# ZIPファイルを解凍
with zipfile.ZipFile(zip_file_name, 'r') as zipf:
zipf.extractall(extract_dir)
print(f"{zip_file_name} を {extract_dir} に解凍しました")
実行結果:
sample.zip を extracted_files に解凍しました
3. よくある使い方・応用例
3-1. 複数ファイルをまとめてZIP圧縮する
import zipfile
files_to_zip = ['sample1.txt', 'sample2.txt', 'sample3.txt']
zip_file_name = 'archive.zip'
with zipfile.ZipFile(zip_file_name, 'w') as zipf:
for file in files_to_zip:
zipf.write(file)
print(f"{file} を圧縮しました")
print(f"{zip_file_name} が作成されました")
実行結果:
sample1.txt を圧縮しました
sample2.txt を圧縮しました
sample3.txt を圧縮しました
archive.zip が作成されました
3-2. shutilモジュールを使った圧縮(ZIP以外)
import shutil
# フォルダごとZIP形式で圧縮
shutil.make_archive('my_folder_backup', 'zip', 'my_folder')
実行結果:
my_folder_backup.zip が作成されました
4. 注意点・エラー対策
4-1. ファイルが存在しない場合の対策
import os
if os.path.exists('sample.txt'):
print("ファイルが存在します")
else:
print("ファイルが見つかりません")
4-2. 同名ファイルの上書きに注意
圧縮する際、既に同名のZIPファイルがあると上書きされます。必要であればバックアップを取ってから作業しましょう。
4-3. extractall()のセキュリティリスク
extractall()
はZIP内のパスも展開するため、意図しないファイル配置(Zip Slip)に注意が必要です。信頼できるZIPファイル以外では使用を避けましょう。
5. まとめ
本記事では、Pythonでファイルを圧縮・解凍する方法について、以下の内容を解説しました。
zipfile
モジュールでファイルをZIP圧縮・解凍する基本操作shutil
モジュールによるディレクトリ圧縮- 複数ファイルやフォルダの応用例
- エラー対策と注意点
Pythonでファイル操作を自動化することで、定期バックアップやログ管理を効率化できます。実務や学習の中で、ぜひこの知識を活かしてみてください。