【Python】7z形式に圧縮する方法

この記事では、Pythonを使って7z形式のファイルを圧縮・解凍する方法をわかりやすく解説します。

初心者の方でも簡単に理解できるように、必要なライブラリのインストール方法から、基本的な使い方、圧縮オプションの設定、エラーハンドリング、そして実践的なスクリプトの例までを順を追って説明します。

目次から探す

必要なライブラリのインストール

Pythonで7z形式のファイルを圧縮するためには、py7zrというライブラリを使用します。

このライブラリは、7z形式のファイルを簡単に圧縮・解凍するための便利なツールです。

まずは、このライブラリをインストールする方法を説明します。

py7zrのインストール

py7zrはPythonのパッケージ管理ツールであるpipを使って簡単にインストールできます。

以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。

pip install py7zr

このコマンドを実行すると、py7zrライブラリが自動的にダウンロードされ、インストールされます。

インストールが完了すると、Pythonスクリプト内でpy7zrをインポートして使用できるようになります。

インストールの確認

インストールが正しく行われたかどうかを確認するために、以下のように簡単なスクリプトを実行してみましょう。

import py7zr
print("py7zrのインストールが成功しました!")

このスクリプトを実行して、「py7zrのインストールが成功しました!」というメッセージが表示されれば、インストールは正常に完了しています。

依存関係の確認

py7zrは他のいくつかのライブラリに依存していますが、pipを使用してインストールする際にこれらの依存関係も自動的にインストールされます。

特に注意する必要はありませんが、もし何らかの理由で依存関係のインストールに失敗した場合は、以下のコマンドを実行して手動でインストールすることもできます。

pip install pycryptodome
pip install texttable

これで、7z形式のファイルを圧縮・解凍するための準備が整いました。

次のセクションでは、実際にpy7zrを使用してファイルを圧縮する方法について詳しく説明します。

基本的な使い方

py7zrのインポート

まず、7z形式のファイルを扱うために必要なライブラリであるpy7zrをインポートします。

以下のコードを使用して、Pythonスクリプト内でpy7zrをインポートします。

import py7zr

ファイルの圧縮

単一ファイルの圧縮

単一のファイルを7z形式に圧縮する方法を見てみましょう。

以下のコードは、example.txtというファイルをarchive.7zという名前で圧縮する例です。

import py7zr
# 圧縮するファイルのパス
file_to_compress = 'example.txt'
# 出力する7zファイルのパス
output_archive = 'archive.7z'
# 7zファイルを作成してファイルを圧縮
with py7zr.SevenZipFile(output_archive, 'w') as archive:
    archive.write(file_to_compress, 'example.txt')

このコードを実行すると、example.txtarchive.7zという名前で圧縮されます。

複数ファイルの圧縮

複数のファイルを一つの7zアーカイブに圧縮する方法も見てみましょう。

以下のコードは、file1.txtfile2.txtarchive.7zという名前で圧縮する例です。

import py7zr
# 圧縮するファイルのリスト
files_to_compress = ['file1.txt', 'file2.txt']
# 出力する7zファイルのパス
output_archive = 'archive.7z'
# 7zファイルを作成して複数のファイルを圧縮
with py7zr.SevenZipFile(output_archive, 'w') as archive:
    for file in files_to_compress:
        archive.write(file, file)

このコードを実行すると、file1.txtfile2.txtarchive.7zという名前で圧縮されます。

ディレクトリの圧縮

ディレクトリ全体を7z形式に圧縮する方法もあります。

以下のコードは、example_dirというディレクトリをarchive.7zという名前で圧縮する例です。

import py7zr
import os
# 圧縮するディレクトリのパス
dir_to_compress = 'example_dir'
# 出力する7zファイルのパス
output_archive = 'archive.7z'
# 7zファイルを作成してディレクトリを圧縮
with py7zr.SevenZipFile(output_archive, 'w') as archive:
    for root, dirs, files in os.walk(dir_to_compress):
        for file in files:
            file_path = os.path.join(root, file)
            archive.write(file_path, os.path.relpath(file_path, dir_to_compress))

このコードを実行すると、example_dirディレクトリ内のすべてのファイルとサブディレクトリがarchive.7zという名前で圧縮されます。

以上が、py7zrを使用して7z形式にファイルやディレクトリを圧縮する基本的な方法です。

次に、圧縮オプションの設定について詳しく見ていきましょう。

圧縮オプションの設定

Pythonで7z形式に圧縮する際には、さまざまなオプションを設定することができます。

これにより、圧縮の効率やセキュリティを向上させることができます。

以下では、圧縮レベルの設定、パスワード保護、圧縮形式の選択について詳しく解説します。

圧縮レベルの設定

圧縮レベルは、圧縮の速度と圧縮率のバランスを調整するための設定です。

高い圧縮レベルを設定すると、圧縮率は高くなりますが、圧縮にかかる時間が長くなります。

逆に、低い圧縮レベルを設定すると、圧縮は速くなりますが、圧縮率は低くなります。

py7zrライブラリでは、compressionオプションを使用して圧縮レベルを設定できます。

以下に例を示します。

import py7zr
# 圧縮レベルを設定してファイルを圧縮
with py7zr.SevenZipFile('example.7z', 'w', compression=py7zr.COMPRESSION_LEVEL_FASTEST) as archive:
    archive.write('example.txt', 'example.txt')

上記の例では、COMPRESSION_LEVEL_FASTESTを使用して最速の圧縮を行っています。

他にも以下のような圧縮レベルがあります。

定数説明
py7zr.COMPRESSION_LEVEL_FASTEST最速の圧縮
py7zr.COMPRESSION_LEVEL_FAST速い圧縮
py7zr.COMPRESSION_LEVEL_NORMAL通常の圧縮
py7zr.COMPRESSION_LEVEL_MAXIMUM最大の圧縮
py7zr.COMPRESSION_LEVEL_ULTRA超高圧縮

パスワード保護

圧縮ファイルにパスワードを設定することで、セキュリティを強化することができます。

py7zrライブラリでは、passwordオプションを使用してパスワードを設定できます。

import py7zr
# パスワードを設定してファイルを圧縮
with py7zr.SevenZipFile('example_protected.7z', 'w', password='your_password') as archive:
    archive.write('example.txt', 'example.txt')

上記の例では、your_passwordというパスワードを設定してファイルを圧縮しています。

解凍する際には、同じパスワードを使用する必要があります。

圧縮形式の選択

py7zrライブラリでは、さまざまな圧縮形式を選択することができます。

デフォルトではLZMA2形式が使用されますが、他の形式も選択可能です。

以下に例を示します。

import py7zr
# 圧縮形式を設定してファイルを圧縮
with py7zr.SevenZipFile('example_lzma.7z', 'w', filters=[{'id': py7zr.FILTER_LZMA}]) as archive:
    archive.write('example.txt', 'example.txt')

上記の例では、LZMA形式を使用してファイルを圧縮しています。

他にも以下のような圧縮形式があります。

定数説明
py7zr.FILTER_LZMALZMA形式
py7zr.FILTER_LZMA2LZMA2形式(デフォルト)
py7zr.FILTER_BZIP2BZIP2形式
py7zr.FILTER_DEFLATEDEFLATE形式

これらのオプションを組み合わせることで、用途に応じた最適な圧縮設定を行うことができます。

圧縮ファイルの解凍

圧縮ファイルを解凍する方法について説明します。

解凍も非常に簡単で、py7zrライブラリを使用して行います。

以下に、単一ファイル、複数ファイル、ディレクトリの解凍方法を順に説明します。

単一ファイルの解凍

まずは、7z形式で圧縮された単一ファイルを解凍する方法を見ていきましょう。

import py7zr
# 解凍する7zファイルのパス
archive_path = 'example.7z'
# 解凍先のディレクトリ
extract_path = 'extracted_files'
# 7zファイルを開く
with py7zr.SevenZipFile(archive_path, mode='r') as archive:
    # 指定したディレクトリに解凍
    archive.extractall(path=extract_path)

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

py7zr.SevenZipFileクラスを使用して7zファイルを開き、extractallメソッドで解凍を行います。

複数ファイルの解凍

次に、複数ファイルが含まれている7zアーカイブを解凍する方法を見ていきます。

基本的には単一ファイルの解凍と同じ手順です。

import py7zr
# 解凍する7zファイルのパス
archive_path = 'multiple_files.7z'
# 解凍先のディレクトリ
extract_path = 'extracted_files'
# 7zファイルを開く
with py7zr.SevenZipFile(archive_path, mode='r') as archive:
    # 指定したディレクトリに解凍
    archive.extractall(path=extract_path)

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

複数ファイルが含まれていても、extractallメソッドを使用することで一括で解凍できます。

ディレクトリの解凍

最後に、ディレクトリが含まれている7zアーカイブを解凍する方法を見ていきます。

こちらも基本的には同じ手順です。

import py7zr
# 解凍する7zファイルのパス
archive_path = 'directory.7z'
# 解凍先のディレクトリ
extract_path = 'extracted_directory'
# 7zファイルを開く
with py7zr.SevenZipFile(archive_path, mode='r') as archive:
    # 指定したディレクトリに解凍
    archive.extractall(path=extract_path)

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

ディレクトリが含まれている場合でも、extractallメソッドを使用することで簡単に解凍できます。

以上が、7z形式の圧縮ファイルを解凍する方法です。

py7zrライブラリを使用することで、非常に簡単に解凍作業を行うことができます。

エラーハンドリング

Pythonで7z形式の圧縮や解凍を行う際には、エラーハンドリングが重要です。

エラーが発生した場合に適切に対処することで、プログラムの信頼性と安定性を向上させることができます。

ここでは、圧縮時と解凍時のエラーハンドリング、そしてファイルの存在確認について解説します。

圧縮時のエラー

圧縮時にエラーが発生する可能性があります。

例えば、指定したファイルが存在しない場合や、書き込み権限がない場合などです。

以下のコード例では、try-exceptブロックを使用してエラーハンドリングを行っています。

import py7zr
import os
def compress_file(input_file, output_file):
    try:
        with py7zr.SevenZipFile(output_file, 'w') as archive:
            archive.write(input_file, os.path.basename(input_file))
        print(f"{input_file}を{output_file}に圧縮しました。")
    except FileNotFoundError:
        print(f"エラー: {input_file}が見つかりません。")
    except PermissionError:
        print(f"エラー: {output_file}に書き込む権限がありません。")
    except Exception as e:
        print(f"予期しないエラーが発生しました: {e}")
# 使用例
compress_file('example.txt', 'example.7z')

解凍時のエラー

解凍時にもエラーが発生する可能性があります。

例えば、指定したアーカイブファイルが存在しない場合や、読み取り権限がない場合などです。

以下のコード例では、try-exceptブロックを使用してエラーハンドリングを行っています。

import py7zr
def extract_file(archive_file, output_dir):
    try:
        with py7zr.SevenZipFile(archive_file, 'r') as archive:
            archive.extractall(path=output_dir)
        print(f"{archive_file}を{output_dir}に解凍しました。")
    except FileNotFoundError:
        print(f"エラー: {archive_file}が見つかりません。")
    except PermissionError:
        print(f"エラー: {output_dir}に書き込む権限がありません。")
    except Exception as e:
        print(f"予期しないエラーが発生しました: {e}")
# 使用例
extract_file('example.7z', './extracted')

ファイルの存在確認

圧縮や解凍を行う前に、対象のファイルやディレクトリが存在するかどうかを確認することも重要です。

以下のコード例では、os.path.exists()関数を使用してファイルの存在確認を行っています。

import os
def check_file_exists(file_path):
    if os.path.exists(file_path):
        print(f"{file_path}は存在します。")
    else:
        print(f"エラー: {file_path}は存在しません。")
# 使用例
check_file_exists('example.txt')
check_file_exists('example.7z')

これらのエラーハンドリングの方法を組み合わせることで、より堅牢な圧縮・解凍スクリプトを作成することができます。

エラーが発生した場合でも、適切に対処することでプログラムの信頼性を向上させることができます。

実践例

ここでは、実際にPythonを使って7z形式でファイルを圧縮する具体的なシナリオを紹介します。

これらの例を通じて、実際の業務やプロジェクトでどのように活用できるかを理解していただければと思います。

バックアップスクリプトの作成

まずは、定期的に特定のディレクトリをバックアップするスクリプトを作成してみましょう。

例えば、毎日特定のフォルダを7z形式で圧縮し、バックアップとして保存するスクリプトです。

import py7zr
import os
from datetime import datetime
# バックアップするディレクトリ
backup_dir = 'path/to/backup_dir'
# バックアップファイルの保存先
backup_dest = 'path/to/backup_dest'
# 現在の日付を取得
current_date = datetime.now().strftime('%Y-%m-%d')
# 圧縮ファイルの名前を作成
archive_name = os.path.join(backup_dest, f'backup_{current_date}.7z')
# 圧縮処理
with py7zr.SevenZipFile(archive_name, 'w') as archive:
    archive.writeall(backup_dir, 'base')
print(f'バックアップが完了しました: {archive_name}')

このスクリプトは、指定したディレクトリを7z形式で圧縮し、日付を含むファイル名で保存します。

これにより、毎日のバックアップが簡単に管理できます。

ログファイルの圧縮と送信

次に、ログファイルを圧縮してメールで送信するスクリプトを作成します。

例えば、サーバーのログファイルを定期的に圧縮し、管理者に送信する場合です。

import py7zr
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders
import os
# ログファイルのディレクトリ
log_dir = 'path/to/log_dir'
# 圧縮ファイルの保存先
archive_name = 'logs.7z'
# 圧縮処理
with py7zr.SevenZipFile(archive_name, 'w') as archive:
    archive.writeall(log_dir, 'logs')
# メールの設定
sender_email = '[email protected]'
receiver_email = '[email protected]'
subject = 'ログファイルのバックアップ'
body = '最新のログファイルを添付します。'
# メールの作成
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))
# 圧縮ファイルを添付
with open(archive_name, 'rb') as attachment:
    part = MIMEBase('application', 'octet-stream')
    part.set_payload(attachment.read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', f'attachment; filename= {archive_name}')
    msg.attach(part)
# メールの送信
with smtplib.SMTP('smtp.example.com', 587) as server:
    server.starttls()
    server.login(sender_email, 'your_password')
    server.sendmail(sender_email, receiver_email, msg.as_string())
print('ログファイルが送信されました')

このスクリプトは、ログファイルを圧縮し、指定したメールアドレスに送信します。

これにより、ログファイルの管理が容易になります。

大量データのアーカイブ

最後に、大量のデータを効率的にアーカイブするスクリプトを紹介します。

例えば、プロジェクトの終了時に大量のデータを7z形式で圧縮して保存する場合です。

import py7zr
import os
# アーカイブするディレクトリ
data_dir = 'path/to/data_dir'
# 圧縮ファイルの保存先
archive_name = 'project_data.7z'
# 圧縮処理
with py7zr.SevenZipFile(archive_name, 'w') as archive:
    archive.writeall(data_dir, 'data')
print(f'データのアーカイブが完了しました: {archive_name}')

このスクリプトは、指定したディレクトリを7z形式で圧縮し、プロジェクトデータとして保存します。

これにより、大量のデータを効率的に管理できます。

以上の実践例を通じて、Pythonを使った7z形式の圧縮方法が理解できたかと思います。

これらのスクリプトを参考に、さまざまなシナリオで活用してみてください。

目次から探す