LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-14

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

注意:
このまんま実行しちゃダメ.
実際には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()))
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1