【Python】フォルダを除外してファイルのみzip圧縮する方法を解説

この記事では、Pythonの標準ライブラリであるzipfileモジュールを使って、フォルダを除外し、ファイルだけを効率的に圧縮する方法をわかりやすく解説します。

基本的な使い方から、実際のスクリプトの作成、実行方法、そして応用例まで、初心者でも理解できるように丁寧に説明します。

これを読めば、Pythonでのファイル圧縮が簡単にできるようになりますよ。

目次から探す

zipfileモジュールの基本

Pythonには標準ライブラリとして、ファイルを圧縮・解凍するためのzipfileモジュールが用意されています。

このモジュールを使うことで、簡単にzipファイルの作成や操作が可能です。

ここでは、zipfileモジュールの基本について解説します。

zipfileモジュールの概要

zipfileモジュールは、Pythonの標準ライブラリの一部であり、zipファイルの作成、読み込み、書き込み、追加、削除などの操作を行うための機能を提供します。

これにより、外部ライブラリをインストールすることなく、Pythonのコード内でzipファイルを扱うことができます。

zipfileモジュールの基本機能

zipfileモジュールには、以下のような基本機能があります。

  • zipファイルの作成: 新しいzipファイルを作成し、ファイルを追加することができます。
  • zipファイルの読み込み: 既存のzipファイルを読み込み、その内容を確認したり、ファイルを抽出することができます。
  • ファイルの追加: 既存のzipファイルに新しいファイルを追加することができます。
  • ファイルの削除: zipファイルから特定のファイルを削除することができます。

基本的な使い方

ここでは、zipfileモジュールを使った基本的な操作方法について解説します。

zipファイルの作成方法

まずは、新しいzipファイルを作成する方法を見てみましょう。

以下のコードは、zipfileモジュールを使って新しいzipファイルを作成する例です。

import zipfile
# 新しいzipファイルを作成
with zipfile.ZipFile('example.zip', 'w') as zipf:
    pass  # ここではまだファイルを追加していない

このコードでは、zipfile.ZipFileクラスを使って新しいzipファイルを作成しています。

'w'モードは書き込みモードを意味し、新しいzipファイルを作成する際に使用します。

ファイルの追加方法

次に、zipファイルにファイルを追加する方法を見てみましょう。

以下のコードは、既存のファイルをzipファイルに追加する例です。

import zipfile
# 新しいzipファイルを作成し、ファイルを追加
with zipfile.ZipFile('example.zip', 'w') as zipf:
    zipf.write('file1.txt')
    zipf.write('file2.txt')

このコードでは、zipf.write()メソッドを使って、file1.txtfile2.txtという2つのファイルをzipファイルに追加しています。

write()メソッドは、指定したファイルをzipファイルに追加するためのメソッドです。

以上が、zipfileモジュールの基本的な使い方です。

次のセクションでは、フォルダを除外してファイルのみを圧縮する方法について詳しく解説します。

フォルダを除外してファイルのみを圧縮する方法

フォルダとファイルの判別方法

Pythonでフォルダとファイルを判別するためには、os.pathモジュールを使用します。

このモジュールには、ファイルやディレクトリのパスを操作するための便利な関数が多数含まれています。

os.pathモジュールを使った判別方法

os.pathモジュールのisfile()関数isdir()関数を使うことで、指定したパスがファイルかディレクトリかを判別できます。

import os
path = 'example.txt'
if os.path.isfile(path):
    print(f"{path}はファイルです")
elif os.path.isdir(path):
    print(f"{path}はディレクトリです")
else:
    print(f"{path}は存在しません")

このスクリプトでは、example.txtがファイルであるかディレクトリであるかを判別し、結果を出力します。

os.walk()関数の使い方

os.walk()関数は、ディレクトリツリーを再帰的に走査するための便利な関数です。

この関数を使うと、指定したディレクトリ以下のすべてのファイルとディレクトリを簡単にリストアップできます。

import os
for root, dirs, files in os.walk('example_directory'):
    print(f"現在のディレクトリ: {root}")
    print(f"サブディレクトリ: {dirs}")
    print(f"ファイル: {files}")

このスクリプトでは、example_directory以下のすべてのディレクトリとファイルをリストアップし、それぞれのパスを出力します。

ファイルのみを圧縮するスクリプトの作成

ここからは、フォルダを除外してファイルのみを圧縮するスクリプトを作成していきます。

スクリプトの全体像

まずは、スクリプトの全体像を示します。

import os
import zipfile
def zip_files_only(directory, zip_name):
    with zipfile.ZipFile(zip_name, 'w') as zipf:
        for root, dirs, files in os.walk(directory):
            for file in files:
                file_path = os.path.join(root, file)
                zipf.write(file_path, os.path.relpath(file_path, directory))
zip_files_only('example_directory', 'output.zip')

このスクリプトは、example_directory以下のすべてのファイルをoutput.zipに圧縮します。

各部分の詳細解説

それでは、スクリプトの各部分について詳しく解説していきます。

圧縮対象のファイルをリストアップ

まず、os.walk()関数を使って、指定したディレクトリ以下のすべてのファイルをリストアップします。

for root, dirs, files in os.walk(directory):
    for file in files:
        file_path = os.path.join(root, file)

この部分では、os.walk()関数を使ってディレクトリツリーを走査し、各ファイルのパスを取得しています。

os.walk()を使ったファイルのリストアップ

os.walk()関数は、指定したディレクトリ以下のすべてのディレクトリとファイルを再帰的にリストアップします。

これにより、フォルダを除外してファイルのみをリストアップすることができます。

フォルダを除外するロジック

os.walk()関数を使うことで、フォルダを自動的に除外し、ファイルのみをリストアップできます。

これにより、フォルダを手動で除外する必要がなくなります。

zipファイルの作成とファイルの追加

次に、zipfile.ZipFile()を使ってzipファイルを作成し、リストアップしたファイルを追加します。

zipfile.ZipFile()の使い方

zipfile.ZipFile()は、zipファイルを作成、読み込み、書き込みするためのクラスです。

このクラスを使うことで、簡単にzipファイルを操作できます。

with zipfile.ZipFile(zip_name, 'w') as zipf:
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            zipf.write(file_path, os.path.relpath(file_path, directory))

この部分では、zipfile.ZipFile()を使ってoutput.zipを作成し、リストアップしたファイルを追加しています。

ファイルを追加する方法

zipfile.ZipFile.write()メソッドを使うことで、指定したファイルをzipファイルに追加できます。

このメソッドには、追加するファイルのパスと、zipファイル内での相対パスを指定します。

zipf.write(file_path, os.path.relpath(file_path, directory))

この部分では、file_pathoutput.zipに追加し、相対パスを指定しています。

以上で、フォルダを除外してファイルのみを圧縮するスクリプトの作成が完了です。

このスクリプトを実行することで、指定したディレクトリ以下のすべてのファイルをzipファイルに圧縮できます。

実行と動作確認

スクリプトの実行方法

コマンドラインからの実行方法

Pythonスクリプトを実行するためには、コマンドライン(ターミナル)を使用します。

以下の手順でスクリプトを実行します。

  1. スクリプトの保存:

まず、作成したPythonスクリプトを任意の名前で保存します。

例えば、zip_files_only.pyという名前で保存します。

  1. コマンドラインを開く:

Windowsの場合は「コマンドプロンプト」、MacやLinuxの場合は「ターミナル」を開きます。

  1. スクリプトのディレクトリに移動:

コマンドラインでスクリプトが保存されているディレクトリに移動します。

以下のコマンドを使用します。

cd /path/to/your/script

例: cd C:\Users\YourName\Documents

  1. スクリプトの実行:

以下のコマンドを入力してスクリプトを実行します。

python zip_files_only.py

実行時の注意点

  • Pythonのバージョン:

スクリプトがPython 3.xで動作することを確認してください。

Python 2.xでは動作しない可能性があります。

  • 必要なモジュールのインストール:

zipfileosモジュールは標準ライブラリに含まれているため、追加のインストールは不要です。

  • パスの指定:

スクリプト内で指定するパスが正しいことを確認してください。

特に、圧縮対象のディレクトリや出力先のパスが存在することを確認します。

圧縮結果の確認

作成されたzipファイルの内容確認

スクリプトが正常に実行されると、指定した場所にzipファイルが作成されます。

以下の手順で内容を確認します。

  1. ファイルエクスプローラーを開く:

Windowsの場合は「エクスプローラー」、Macの場合は Finder を開きます。

  1. zipファイルの場所に移動:

スクリプトで指定した出力先のディレクトリに移動します。

  1. zipファイルを開く:

作成されたzipファイルをダブルクリックして開きます。

zipファイルの内容が表示されます。

フォルダが除外されていることの確認

zipファイルの内容を確認する際に、フォルダが除外されていることを確認します。

以下の点に注意します。

  • ファイルのみが含まれていること:

zipファイル内にフォルダが含まれていないことを確認します。

ファイルのみが圧縮されているはずです。

  • ファイルのパス:

圧縮されたファイルのパスが正しいことを確認します。

元のディレクトリ構造が保持されている場合もありますが、フォルダ自体は含まれていないことを確認します。

以上の手順で、スクリプトの実行と圧縮結果の確認が完了します。

これで、フォルダを除外してファイルのみをzip圧縮する方法が理解できたと思います。

応用例と注意点

応用例

特定の拡張子のみを圧縮する方法

特定の拡張子を持つファイルのみを圧縮したい場合、ファイルのリストアップ時に拡張子をチェックするロジックを追加します。

以下は、.txtファイルのみを圧縮する例です。

import os
import zipfile
def zip_specific_extension(directory, zip_name, extension):
    with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for root, dirs, files in os.walk(directory):
            for file in files:
                if file.endswith(extension):
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, os.path.relpath(file_path, directory))
# 使用例
zip_specific_extension('example_directory', 'output.zip', '.txt')

このスクリプトでは、example_directory内のすべての.txtファイルをoutput.zipに圧縮します。

複数のディレクトリを一度に圧縮する方法

複数のディレクトリを一度に圧縮する場合、各ディレクトリを順番に処理するループを追加します。

以下は、複数のディレクトリを一つのzipファイルに圧縮する例です。

import os
import zipfile
def zip_multiple_directories(directories, zip_name):
    with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for directory in directories:
            for root, dirs, files in os.walk(directory):
                for file in files:
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, os.path.relpath(file_path, directory))
# 使用例
directories_to_zip = ['dir1', 'dir2', 'dir3']
zip_multiple_directories(directories_to_zip, 'output.zip')

このスクリプトでは、dir1dir2dir3の各ディレクトリ内のすべてのファイルをoutput.zipに圧縮します。

注意点

大量のファイルを扱う際のパフォーマンス

大量のファイルを圧縮する場合、メモリ使用量や処理時間が問題になることがあります。

以下の点に注意してください。

  • メモリ使用量: 一度に大量のファイルをメモリに読み込むと、メモリ不足になる可能性があります。

必要に応じて、ファイルを分割して処理することを検討してください。

  • 処理時間: 大量のファイルを圧縮するには時間がかかることがあります。

進捗状況を表示するなどして、ユーザーに処理が進行中であることを知らせると良いでしょう。

圧縮ファイルのサイズ制限

圧縮ファイルのサイズには制限があります。

特に、古いzip形式では4GBの制限があります。

これを超える場合は、zip64形式を使用する必要があります。

Pythonのzipfileモジュールはデフォルトでzip64形式をサポートしていますが、古いツールやライブラリでは対応していない場合があります。

import os
import zipfile
def zip_large_files(directory, zip_name):
    with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED, allowZip64=True) as zipf:
        for root, dirs, files in os.walk(directory):
            for file in files:
                file_path = os.path.join(root, file)
                zipf.write(file_path, os.path.relpath(file_path, directory))
# 使用例
zip_large_files('large_files_directory', 'large_output.zip')

このスクリプトでは、large_files_directory内のすべてのファイルをlarge_output.zipに圧縮します。

allowZip64=Trueオプションを指定することで、4GBを超えるファイルも圧縮可能です。

以上の応用例と注意点を参考に、より柔軟で効率的なファイル圧縮スクリプトを作成してください。

目次から探す