大量の画像ファイルを扱う業務や趣味の整理で、自動で画像を分類できたら便利ですよね。この記事では、Pythonを使って画像のファイル名や拡張子、サイズ、撮影日などの条件に応じてフォルダ分けするスクリプトの作り方を解説します。
使用するライブラリ
pip install pillow
標準ライブラリと合わせて、画像のメタデータを扱うために Pillow を使用します。
基本的な分類ロジックの概要
以下のいずれかの条件で分類できます。
- 拡張子ごと(.jpg, .png, .gifなど)
- ファイル名に含まれるキーワード
- 撮影日(EXIF情報)
- ファイルサイズ(大きさで分類)
画像を拡張子別に分類するサンプルコード
import os
import shutil
# 分類元のフォルダ
input_dir = './images'
# 画像ファイルを走査して拡張子別にサブフォルダへ移動
for filename in os.listdir(input_dir):
if os.path.isfile(os.path.join(input_dir, filename)):
ext = filename.split('.')[-1].lower()
target_dir = os.path.join(input_dir, ext)
os.makedirs(target_dir, exist_ok=True)
shutil.move(os.path.join(input_dir, filename), os.path.join(target_dir, filename))
print("拡張子別の分類が完了しました。")
ファイル名のキーワードで分類する場合
例えば、cat_001.jpg, dog_001.jpg といったファイル名から cat や dog のディレクトリに振り分けます。
keywords = ['cat', 'dog', 'bird']
for filename in os.listdir(input_dir):
for keyword in keywords:
if keyword in filename.lower():
target_dir = os.path.join(input_dir, keyword)
os.makedirs(target_dir, exist_ok=True)
shutil.move(os.path.join(input_dir, filename), os.path.join(target_dir, filename))
EXIF情報(撮影日)で分類する
撮影年・月ごとにフォルダを作成して分類する方法です。
from PIL import Image
from PIL.ExifTags import TAGS
from datetime import datetime
def get_taken_date(path):
try:
image = Image.open(path)
exif = image._getexif()
for tag_id, value in exif.items():
tag = TAGS.get(tag_id, tag_id)
if tag == 'DateTimeOriginal':
return datetime.strptime(value, '%Y:%m:%d %H:%M:%S').strftime('%Y-%m')
except Exception:
return None
for filename in os.listdir(input_dir):
filepath = os.path.join(input_dir, filename)
if os.path.isfile(filepath):
taken_date = get_taken_date(filepath)
if taken_date:
target_dir = os.path.join(input_dir, taken_date)
os.makedirs(target_dir, exist_ok=True)
shutil.move(filepath, os.path.join(target_dir, filename))
応用 複数条件で分類したい場合
例えば「キーワード + 撮影月」などの多段分類をしたい場合は、分類ディレクトリの階層を工夫することで柔軟に対応可能です。
まとめ
Pythonによる画像の自動分類は、業務効率化にも趣味の整理にも非常に役立ちます。EXIFやファイル名など、用途に合わせて組み合わせることで、柔軟な整理ロジックが構築できます。ぜひご自身の環境に合わせてカスタマイズして活用してください。