Python小应用系列之用拍摄时间重命名你的照片

Python小应用系列之用拍摄时间重命名你的照片

1 环境

操作系统:Windows

Python版本:3.6.6

2 背景

使用单反或是用iphone手机拍摄后的照片名字都是以“IMG_数字.jpg”的命名,当有在大量照片时,查找某一时间段拍摄的照片就很不方便,并且在归档管理上很容易出现重名的问题。若是采用“拍摄年月日_时分秒.jpg”的方式来命名,那么就能避免上述问题的出现,毕竟1秒钟拍多张照片的场景不会很多。那么问题来了,如何得到照片的拍摄等信息呢?

3 引入

首先随便打开一张照片来一探究竟,现在的图片处理工具都会提供图片信息之类的功能菜单来查看详情。如下图:

可以看到一张图片中竟记录了这么多信息,如:曝光度,光圈,焦距,快门,机身等,同时也发现了我们关心的字段,照片的拍摄时间。这些信息是什么?又是记录在哪里的呢?

3.1 Exif信息

如上图所示的数码照片中的信息诸如拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等统称之为EXIF信息。

所有的JPEG文件以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。文件头中有一系列“0xFF??”格式的字符串,称为“标识”,用来标记JPEG文件的信息段。“0xFFD8”表示图像信息开始,“0xFFD9”表示图像信息结束,这两个标识后面没有信息,而其它标识紧跟一些信息字符。0xFFE0 — 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息的。

了解完上述信息后,接下来就看看在Python中是如何读取Exif信息的?

3.2 exifread模块

这里就要用到exifread模块,直接使用pip就可以安装:

pip install exifread

我们可以使用这个模块去读取图片中的信息,由于我们只关心照片的拍摄时间,它对应Exif信息中的标签名称如下:EXIF DateTimeOriginal

我们只需要拿到这个字段对应的值之后,就得到了照片的拍摄时间。接下来便可以用拍摄时间对照片进行重命名的操作了。

好了,整体的思路有了,现在下面就是具体的代码实现。

4 代码实现

首先指定好路径,并拿到要处理的文件:

# 修改要处理的目录
IMGPath = "P:\\Personal\\Python\\"

for IMGName in os.listdir(IMGPath): 
    # 拼接出原文件路径
    full_name = os.path.join(IMGPath, IMGName)
    # 判断是否为文件
    if os.path.isfile(full_name):
        # 调用opExif函数对文件进行处理操作
        opExif(IMGPath, IMGName)

使用二进制方式打开文件,读取文件头部的EXIF信息:

with open(old_full_name, "rb") as f:
    tags = exifread.process_file(f)

若读取的文件头部信息匹配了EXIF信息中拍摄时间的标签,则进行处理并组成新的名字:

# 先拿到原文件的后缀
file_suffix = os.path.splitext(file_name)[1]
# EXIF信息中拍摄时间的标签
Tag = "EXIF DateTimeOriginal"
if Tag in tags:
    # 调整原始的时间格式为"年月日_时分秒"
    file_stem = str(tags[Tag]).replace(':', '').replace(' ', '_') 
    # 新文件名:年月日_时分秒.原后缀名   
    new_name = file_stem + file_suffix

当然了,你还可以加个序号以防重名:

num = 1
while os.path.exists(new_name):
     # 年月日_时分秒_序号.原后缀名
     new_name = file_stem + '_' + str(num) + file_suffix 
     num += 1

接下来就是重命名的操作:

# 拼接出新文件路径
new_full_name = os.path.join(file_path, new_name)
print(f"{old_full_name} >>> {new_full_name}")
# 执行重命名操作
os.rename(old_full_name, new_full_name)

实际执行的效果如下:

不足30行代码就搞定它了,是不是很开心?赶快操作起来吧~

本文所涉及的完整代码详见HGzhao/PythonApps

备注:本篇首发于知识星球「人人都是Pythonista」。


文章作者: &娴敲棋子&
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 &娴敲棋子& !
评论
  目录