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()