python3

ファイル移動とかしたら日付が更新されてしまうSDとかでぐちゃぐちゃになった写真の更新日時を修正する

ライブラリ名とかよく忘れるので.

注意:
このまんま実行しちゃダメ.
実際にはipythonで書いて,該当する方のループだけ実行するとか工夫すること.

import time
import datetime
import os
import re
import time

from PIL import Image
from PIL.ExifTags import TAGS

# 共通部
dname = 'dirname'
def update_time(f, t):
    os.utime(f, (t, t))

# ファイル名から取得できる場合
pat   = re.compile('(?P<date>\d{8}).*(?P<time>\d{6})')   # yyyymmdd_hhmmss
#pat   = re.compile('(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}\.\d{2}\.\d{2})') # yyyy-mm-dd hh.mm.ss

for f in os.listdir(dname):
    mat = pat.search(dname + '/' + f)
    if mat:
        dt = datetime.datetime.strptime('-'.join(mat.groups()),'%Y%m%d-%H%M%S')
        #dt = datetime.datetime.strptime('-'.join(mat.groups()),'%Y-%m-%d-%H.%M.%S')
        update_time(dname + '/' + f, time.mktime(dt.timetuple()))
    else:
        continue

# ファイル名は単なる通番の場合
def created_on(fname):
    im = Image.open(fname)

    try:
        exif = im._getexif()
    except AttributeError:
        return None

    for tag_id, value in exif.items():
        tag = TAGS.get(tag_id, tag_id)
        if tag == 'DateTimeDigitized':
            dt = [map(int, t.split(':')) for t in value.split(' ')]
            return datetime.datetime(*(list(dt[0])+list(dt[1])))
    else:
        # DateTimeDigitizedがない場合
        return None

for fname in os.listdir(dname):
    dt = created_on(dname + '/' + fname)
    if dt is None:
        continue
    else:
        update_time(dname + '/' + fname, time.mktime(dt.timetuple()))