ExifデータとPillowで画像の名前を撮影日時にする
このスクリプトを実行すると、指定したディレクトリ内の画像ファイルが新しいフォルダにExifの撮影日時でリネームされ、保存されます。

データーの整理をするときに便利撮影日時になっていると便利だよね
画像の名前を変えたもの(test1.jpgのように)も、撮影日時のデータで名前が変更されました。
完成をすると、下記のように表示されます。
新しいフォルダが作成され、test1とtest2の画像の名前が

renamed-imagesフォルダの中の画像の名前が撮影した日時の名前になる

Exifデータとは
Exifデータとは、Exchangeable Image File Format(エクスチェンジャブル・イメージ・ファイル・フォーマット)の略で、デジタルカメラやスマートフォンなどの機器で撮影したデジタル写真に付与される撮影情報や位置情報などのデータのことです。
詳しくは、コチラにExifについてやPillowについて書いているよ
使用素材
コチラの2種類の画像を一度にリネームしていきます。
ミラーレスカメラで撮った画像

iphoneで撮影した画像

Pythonのバージョン
Python3.12.1のバージョンを使用しています。
PCにPythonが導入されている前提で話を進めます。
導入がまだの方はこちらで導入してね。
Python
↓ここをクリック
Dockを立ち上げる
command+「スペースキー」で検索窓が出てくる>「ターミナル」と記入>

「自分のPC名〜%」の後ろに記入していきます。
(例)gotoaya@AGMacBook-Air ~ % ←ここの後ろに記入
Pillowをインストール
Pillowとは
Pillowは、Pythonの画像処理ライブラリであり、画像の生成、変換、処理、表示などの機能を提供します。Pillowは、Python Imaging Library(PIL)のフォークであり、PILの後継として開発されました。画像処理や画像生成など、様々なタスクに利用できます。
Pillowをインストール方法
インストール済みの方は無しでOKです。
Pillowを入れた記憶のない方はコチラを記入してインストール
pip install Pillow
>Enter
EXIFの日時データを書き出してターミナルに書くコードを記入する
import os
from PIL import Image
from PIL.ExifTags import TAGS
def get_original_datetime(image_path):
try:
with Image.open(image_path) as img:
exif_data = img._getexif()
if exif_data is not None:
for tag, value in exif_data.items():
tag_name = TAGS.get(tag, tag)
if tag_name == 'DateTimeOriginal':
return value
except (AttributeError, KeyError, IndexError):
pass
return None
def rename_and_move_images(directory_path):
# 新しいフォルダを作成
new_folder_path = os.path.join(directory_path, "renamed_images")
os.makedirs(new_folder_path, exist_ok=True)
# ディレクトリ内の画像ファイルを処理
for filename in os.listdir(directory_path):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
image_path = os.path.join(directory_path, filename)
original_datetime = get_original_datetime(image_path)
if original_datetime is not None:
try:
with Image.open(image_path) as img:
new_name = original_datetime.replace(":", "").replace(" ", "_") + ".jpg"
new_path = os.path.join(new_folder_path, new_name)
img.save(new_path)
print(f"Image renamed and moved successfully: {new_path}")
except Exception as e:
print(f"Error while renaming and moving image: {e}")
else:
print(f"DateTimeOriginal not found in Exif data for {filename}.")
# ここに画像ファイルが含まれるディレクトリのパスを指定してください
image_directory_path = "/Users/gotoaya/Desktop/test14"
# 画像の名前をExifの撮影日時に変更して新しいフォルダに移動する
rename_and_move_images(image_directory_path)
※ディレクトリのパスは、私の場合「/Users/gotoaya/Desktop/test14」にしています。変更したい画像が含まれるディレクトリのパスをimage_directory_path
に指定してください。
※新しいフォルダはrenamed_images
という名前で作成され、その中に画像が保存されます。
Pythonの拡張子で保存
Pythonの拡張子(.py)で保存して画像と同じフォルダに入れる。
一つのフォルダに画像と.pyコードを格納
今回は「test8」という名前のフォルダに格納しました

Dockを立ち上げる
command+「スペースキー」で検索窓が出てくる>「ターミナル」と記入>

「自分のPC名〜%」の後ろに記入していきます。
(例)gotoaya@AGMacBook-Air ~ % ←ここの後ろに記入
読み込み場所を指定する
cd␣全部格納した、ディレクトリーを記入
cd ディレクトリーを記入

>Enter

cdの後ろに半角スペースを入れないとダメピヨ!
※フォルダーのディレクトリーが分からない時は、フォルダーをターミナルに放り込むと表示されるよ。
「Python ファイル名」を記入して「Enter」
Python␣読み込むファイル名
Python 読み込むファイル名


Pythonの後ろに半角スペースを入れないとダメピヨ!
>Enter

完成
新しいフォルダが作成されています。中を確認すると

2022年11月2日17:21分に撮影された写真の日付け、秒までファイル名になって記載されています。
ミラーレスカメラで撮影のものと、スマホで撮影のもの両方変換されました。

画像整理が簡単になりそうです!

コードの詳しい解説
もちろんです。以下はコードの詳細な解説です。
import os
from PIL import Image
from PIL.ExifTags import TAGS
os
: ファイルシステムとやり取りするためのモジュール。Image
とTAGS
はPillowライブラリからインポートされています。Image
は画像処理のためのクラスを提供し、TAGS
はExifタグの名前を解釈するための辞書です。
def get_original_datetime(image_path):
try:
with Image.open(image_path) as img:
exif_data = img._getexif()
if exif_data is not None:
for tag, value in exif_data.items():
tag_name = TAGS.get(tag, tag)
if tag_name == 'DateTimeOriginal':
return value
except (AttributeError, KeyError, IndexError):
pass
return None
get_original_datetime
: 画像ファイルのExifデータから’DateTimeOriginal’というタグの値(撮影日時)を取得する関数。Image.open(image_path)
: 指定された画像ファイルを開きます。img._getexif()
: 画像からExifデータを取得します。- 取得したExifデータから’DateTimeOriginal’タグの値を探し、見つかればその値を返します。
def rename_and_move_images(directory_path):
new_folder_path = os.path.join(directory_path, "renamed_images")
os.makedirs(new_folder_path, exist_ok=True)
for filename in os.listdir(directory_path):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
image_path = os.path.join(directory_path, filename)
original_datetime = get_original_datetime(image_path)
if original_datetime is not None:
try:
with Image.open(image_path) as img:
new_name = original_datetime.replace(":", "").replace(" ", "_") + ".jpg"
new_path = os.path.join(new_folder_path, new_name)
img.save(new_path)
print(f"Image renamed and moved successfully: {new_path}")
except Exception as e:
print(f"Error while renaming and moving image: {e}")
else:
print(f"DateTimeOriginal not found in Exif data for {filename}.")
# ここに画像ファイルが含まれるディレクトリのパスを指定してください
image_directory_path = "path/to/your/images"
# 画像の名前をExifの撮影日時に変更して新しいフォルダに移動する
rename_and_move_images(image_directory_path)
rename_and_move_images
: 指定されたディレクトリ内の画像ファイルを処理し、新しいフォルダにExifの撮影日時でリネームして保存する関数。os.path.join(directory_path, "renamed_images")
: 新しいフォルダのパスを作成します。os.makedirs(new_folder_path, exist_ok=True)
: 新しいフォルダを作成します。exist_ok=True
はすでにフォルダが存在する場合にエラーを発生させないようにします。os.listdir(directory_path)
: 指定されたディレクトリ内のファイル名のリストを取得します。filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif'))
: 拡張子が指定された画像ファイルかどうかを確認します。os.path.join(directory_path, filename)
: 画像ファイルのフルパスを取得します。get_original_datetime(image_path)
: 画像ファイルからExifの’DateTimeOriginal’を取得します。with Image.open(image_path) as img:
: 画像を開きます。new_name = original_datetime.replace(":", "").replace(" ", "_") + ".jpg"
: 撮影日時を整形して新しいファイル名を生成します。os.path.join(new_folder_path, new_name)
: 新しいフォルダ内に保存するためのパスを作成します。img.save(new_path)
: 画像を新しいパスに保存します。print(f"Image renamed and moved successfully: {new_path}")
: 成功した場合にメッセージを表示します。except Exception as e:
: エラーが発生した場合にエラーメッセージを表示します。else:
: ‘DateTimeOriginal’が見つからなかった場合にメッセージを表示します。
コメント