以前有很多图片和照片拍摄或者存储的时候没有写入时间信息在相册里识别时间线错误,写了个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)