Create TOC

2010년 1월 12일

Python/사진 파일의 시간을 사진을 찍은 시간으로 변경하기

사진 파일(jpg)의 시간을 사진을 찍은 시간으로 변경하는 python script. EXIF.py를 사용한다.

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""jpg 파일 변경 시간을 exif 에서 읽어온 시간으로 변경한다."""
__version__ = '0.1'

import os
import sys
import time
import dircache

import EXIF

# 허가할 확장자 목록
EXTENSIONS = ('.jpg', '.jpeg')

# 사진을 찍은 시간을 얻을 필드. 처음 발견하는 필드를 사용한다.
TAGS = ['Image DateTime', 'EXIF DateTimeOriginal', 'DateTime']


def printUsing():
    """사용 방법을 출력한다.
    """
    print sys.argv[0], '<file or directory>'


def EXIFDateTime2time(exifdatetime):
    """exif의 시간 문자열을 time 값으로 변경한다.

        @param[in]  exifdatetime    시간 문자열

        @return     변환된 time 값
    """
    return time.mktime(time.strptime(exifdatetime, '%Y:%m:%d %H:%M:%S'))


def correctJPGTime(filename):
    """jpg 파일 변경 시간을 수정한다.

        @param[in]  filename    수정할 파일 이름
    """
    fnl = filename.lower()
    for ext in EXTENSIONS:
        # 파일 확장자 검사
        if fnl.endswith(ext):
            f = file(filename, 'rb')
            # exif tag를 읽는다.
            tags = EXIF.process_file(f, details=False)
            for key in TAGS:
                if key in tags:
                    # TAGS 중 처음 발견한 tag의 시간 값을 사용한다.
                    exif_time = EXIFDateTime2time(str(tags[key]))
                    statinfo = os.stat(filename)
                    if exif_time != statinfo.st_mtime:
                        # 시간이 다르면 파일 시간을 변경한다.
                        os.utime(filename, (statinfo.st_atime, exif_time))
                        print 'fix:', filename
                    break
            break


def main():
    if os.path.isdir(sys.argv[1]):
        # 주어진 인자가 디렉토리면
        for name in dircache.listdir(sys.argv[1]):
            # 디렉토리의 파일들에 대해서 수정 작업을 한다.
            # sub directory에 대해서는 아무 작업도 하지 않는다.
            fullname = sys.argv[1] + os.path.sep + name
            if os.path.isfile(fullname):
                correctJPGTime(fullname)
    elif os.path.isfile(sys.argv[1]):
        # 주어진 인자가 파일이면
        correctJPGTime(sys.argv[1])


if __name__ == '__main__':
    if len(sys.argv) < 2:
        printUsing()
        sys.exit(1)
    main()