JPEGのEXIFに記録された撮影日時でファイル作成日時を更新するサンプルPythonスクリプト


このエントリーをはてなブックマークに追加

Windowsにて表題のことをするPythonスクリプトを以下に示します。 os.utime()だとファイルの更新日時、アクセス日時を更新することはできるのですが、 ファイルの作成日時は変更できないところで少し調査が必要でした。

【Python】ファイルとフォルダのタイムスタンプを変更するコード例【作成日時・更新日時・アクセス日時を変更する】 | シラベルノートを参考に、win32-setctimeというパッケージを利用することで ファイルの作成日時を変更できました。

"""
./origディレクトリにあるJPEGファイルについて、
- EXIFから撮影日時を取得し、
- ファイルの作成日時をその撮影日時に変更して、
- ./changedディレクトリに保存

Windows + Python 3.8で動作確認。

参考:
    - https://note.com/kamakiriphysics/n/n8028b4f46922
    - https://srbrnote.work/archives/4054
"""
import datetime
import os
from pathlib import Path
import shutil
import time

from PIL import Image
from PIL.ExifTags import TAGS
import win32_setctime  # pip install win32-setctimeが必要


def main():
    # 元のJPG画像を格納するディレクトリ
    src_dir = Path('orig')
    # 作成日時を変更したJPG画像を格納するディレクトリ
    dst_dir = Path('changed')

    dst_dir.mkdir(exist_ok=True, parents=True)

    for src_img_path in src_dir.glob('*.jpg'):
        src_img = Image.open(src_img_path)
        exif = src_img._getexif()

        # # 取得可能な情報を確認(デバッグ用)
        # for k, v in exif.items():
        #     print(k, TAGS.get(k), v)

        # 写真の撮影日時(DateTimeOriginal)を取得 (e.g. "2023:06:23 09:45:24")
        date = exif[36867]

        # src_imgをdst_dirにコピー
        dst_img_path = dst_dir / src_img_path.name
        shutil.copy2(src_img_path, dst_img_path)

        # 作成日時、更新日時、アクセス日時を決める
        YYYYmmdd, HHMMSS = date.split(' ')
        YYYY, mm, dd = [int(x) for x in YYYYmmdd.split(':')]
        HH, MM, SS = [int(x) for x in HHMMSS.split(':')]
        ctime = mtime = atime \
            = datetime.datetime(YYYY, mm, dd, HH, MM, SS).timestamp()

        # 作成日時、更新日時、アクセス日時を変更
        win32_setctime.setctime(dst_img_path, ctime)
        os.utime(dst_img_path, (atime, mtime))

    print("finished")


if __name__ == '__main__':
    main()