LoginSignup
0
1

More than 3 years have passed since last update.

python3のPILでexifが読み込めない時

Last updated at Posted at 2019-06-16

普通にjpgファイルのexifを読み込もうと思うと、検索して真っ先に出てくるのが以下のコード。
ちなみにやろうとしていたのは、Amazon Photosにバックアップしようとして上書きされたタイムスタンプをexifデータで戻す作業。
(気軽にタイムスタンプを書き換えるサービス、ホント良くない!)

ファイル操作のループは省略。targetfileにフルパスで入ってると思いねェ。
PILでファイルを開いたままos.utimeで書き換えてるのは気持ち悪いと思うが、exifデータに撮影日時が入っている時だけ処理するのをフラグとか面倒なことしないで書くとこうなった。
気になる人は直して使ってちょ。

from PIL import Image
import time
import datetime
import os

with Image.open(targetfile) as im:
    exifdict = im._getexif()
    if 36867 in exifdict:
        newtime = time.mktime(
            datetime.datetime.strptime(
                exifdict[36867],
                '%Y:%m:%d %H:%M:%S'
            ).timetuple()
        )

        os.utime(targetfile, (newtime,newtime))

で、終わりと思いきや、いくつかの写真を読み込もうとしたところ、空の辞書が返却されてしまって困ることがあった。
で、他にexif情報にアクセスする方法を調べてみると、piexifを使う方法が紹介されていて、この場合は全ての写真のexif情報にアクセスできた。
anaconda3で入れてもこいつは入ってこないので、まずインストールから。

pip install piexif

こいつでexif情報にアクセスするとbyte stringで帰ってくるので、デコードすること。
他は同じ。

import piexif
from PIL import Image
import time
import datetime
import os

with Image.open(targetfile) as im:
    exifdict = piexif.load(im.info['exif'])["Exif"]
    if 36867 in exifdict:
        newtime = time.mktime(
            datetime.datetime.strptime(
                exifdict[36867].decode(),
                '%Y:%m:%d %H:%M:%S'
            ).timetuple()
        )

        os.utime(targetfile, (newtime,newtime))
0
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
0
1