【Python】批量修改照片文件名为拍摄日期

需求
最近整理老照片,有一些照片的文件名没有含义和规律。为了方便查看,可以根据拍摄日期,修改文件名为拍摄日期时间(比如IMG_20210422_070707.jpg)。主要是利用piexif库提取JPG照片的Exif,获取拍摄时间,然后修改文件名。

如果两张照片的拍摄时间完全一样,时分秒都相同,就在文件名后累加数字123…区分:
IMG_20210422_070707_1.jpg
IMG_20210422_070707_2.jpg

Python代码

# photo name correction 
# 2021.04 @Wendell
# 需求:修改文件名为拍摄日期,比如:IMG_20210422_070707.jpg

import os
import piexif

def checkFormat(photoPwd):
    '''
    检查文件类型是否为图片格式
    '''
    (root, ext) = os.path.splitext(photoPwd)
    return str.upper(ext[1:]) # 返回文件后缀类型

def checkExif(photoPwd):
    '''
    检查Exif是否包含拍摄日期
    '''
    exif_dict = piexif.load(photoPwd) # 照片的Exif
    exif_time = piexif.ExifIFD.DateTimeOriginal # 时间在exif_dict里面的key
    return exif_time in exif_dict["Exif"] 

def getTime(photoPwd):
    '''
    提取照片拍摄时间
    from '2021:04:22 07:07:07' to '20210422_070707'
    '''
    exif_dict = piexif.load(photoPwd) # 照片的Exif
    exif_time = piexif.ExifIFD.DateTimeOriginal # 时间在exif_dict里面的key
    photoTime = exif_dict["Exif"][exif_time] # byte形式:b'2021:04:22 07:07:07'
    pT = bytes.decode(photoTime) # 转换为str
    photoTime = f'{pT[0:4]}{pT[5:7]}{pT[8:10]}_{pT[11:13]}{pT[14:16]}{pT[17:19]}' # 格式为20210422_070707
    return photoTime

def getNewName(photoTime):
    '''
    获取照片新文件名,另外,如果两张照片时分秒也相同,在文件名后累加数字123...区分
    '''
    count = 1
    new_photoName = f'IMG_{photoTime}.jpg' # e.g., IMG_20210422_070707.jpg
    while new_photoName in os.listdir(folder):
        new_photoName = f'IMG_{photoTime}_{count}.jpg' # e.g., IMG_20210422_070707_X.jpg
        count += 1
    return new_photoName

def setName(photoPwd) :
    '''
    根据拍摄日期重命名照片
    e.g., IMG_20210424_071829.jpg
    '''
    photoTime = getTime(photoPwd)
    new_photoName = getNewName(photoTime) #获取新文件名,如果两张照片时分秒也相同,在最后增加后缀
    new_photoPwd = os.path.join(folder, new_photoName)
    os.rename(photoPwd, new_photoPwd)

def changePhotoName(folder):
    """
    修改JPG照片的文件名为拍摄日期
    e.g., IMG_20210424_071829.jpg
    """
    for photoName in os.listdir(folder):
        photoPwd = os.path.join(folder, photoName) # 照片的绝对路径
        if checkFormat(photoPwd) == 'JPG' and checkExif(photoPwd): # 如果是JPG并且Exif包含时间信息
            setName(photoPwd)


folder = r"D:\照片\测试" #文件夹路径
if __name__ == '__main__':
    '''
    folder: 文件夹路径
    '''
    changePhotoName(folder)

转载自:https://blog.csdn.net/lifeofwww/article/details/116094399