Python3批量根据文件名修改照片的Exif添加时间信息

418 阅读1分钟

以前有很多图片和照片拍摄或者存储的时候没有写入时间信息在相册里识别时间线错误,写了个py脚本可以遍历当前目录下的照片进行修改,支持一下几种文件名格式,目前只匹配当前运行目录的,有递归需求的可以改walk 1371485412561.jpg 毫秒时间戳文件名 SYMMDD-HHIISS.jpg IMG_20120712_144729.jpg PrtScn20120904172055.jpg

from PIL import Image
import piexif
import time  # 引入time模块
import os
import re

def updateImage(filePath):
    fileName = os.path.basename(filePath)

    print('\nfilename:', fileName)

    fileTime = None

    # 1371485412561.jpg 时间戳文件名
    matchObj = re.match(r'(\d{13}).+', fileName)
    if matchObj:
        timeStamp = float(int(matchObj.group(1))/1000)
        fileTime = time.localtime(timeStamp)
        # otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        # print(otherStyleTime)
        # fileTime = otherStyleTime
        print('match timestamp')

    # SYMMDD-HHIISS.jpg
    matchObj = re.match(r'\w{1}(\d{5}-\d{6}).+', fileName)
    if not fileTime and matchObj:
        # timeStamp = float(int(matchObj.group(1))/1000)
        # fileTime = time.localtime(timeStamp)
        # print('time:', '201'+matchObj.group(1))
        fileTime = time.strptime('201'+matchObj.group(1), '%Y%m%d-%H%M%S')
        print('match WYMMDD-HHMMSS.jpg')

    # IMG_20120712_144729.jpg
    matchObj = re.match(r'IMG_(\d{8}_\d{6}).+', fileName)
    if not fileTime and matchObj:
        fileTime = time.strptime(matchObj.group(1), '%Y%m%d_%H%M%S')
        print('match IMG_YYYYMMDD-HHMMSS.jpg')

    # PrtScn20120904172055.jpg
    matchObj = re.match(r'PrtScn(20\d{12}).+', fileName)
    if not fileTime and matchObj:
        fileTime = time.strptime(matchObj.group(1), '%Y%m%d%H%M%S')
        print('match PrtScnYYYYMMDDHHMMSS.jpg')

    if not fileTime:
        print('未从文件名匹配到时间')
        return

    im = Image.open(filePath)
    exif_dict = im.info.get("exif")  # returns None if exif key does not exist
    exif_data = None
    if exif_dict:
        exif_data = piexif.load(exif_dict)
    else:
        # 图片文件缺少exif信息
        # return
        exif_data = {"Exif": {}}
        exif_data['Exif'][piexif.ExifIFD.DateTimeOriginal] = ''
  
    if exif_data["Exif"][piexif.ExifIFD.DateTimeOriginal]:
        print(u'已存在有效时间值', exif_data["Exif"][piexif.ExifIFD.DateTimeOriginal])
        return

    exif_data["Exif"][piexif.ExifIFD.DateTimeOriginal] = time.strftime(
        r'%Y:%m:%d %H:%M:%S', fileTime) .encode()
    exif_bytes = piexif.dump(exif_data)
    im.save(filePath, exif=exif_bytes)
    print(u'已添加时间值', exif_data["Exif"][piexif.ExifIFD.DateTimeOriginal])

if __name__ == '__main__':
    # updateImage('./P20729-183359.jpg')
    filenames = os.listdir(r'./')
    for index in range(len(filenames)):
        filePath = filenames[index]
        if os.path.splitext(filePath)[-1][1:] == "jpg":
            fileSize = os.path.getsize(filePath)
            if fileSize == 0:
                print('*'*20 + 'filesize is 0', filePath)
                with open('./error-file.log', 'at', encoding="utf-8") as f:
                    f.write('*'*20 + 'filesize is 0, ' + filePath+'\n')
                continue
            try:
                updateImage(filePath)
            except Exception as e:
                with open('./error-file.log', 'at', encoding="utf-8") as f:
                    f.write('*'*20+"处理失败"+filePath+'\n')
                print('*'*20+"处理失败", filePath)