点击蓝字 关注我们



上一课整理完下载文件夹后,Tyree的桌面干净了不少。但他很快发现了另一个问题:手机拍的照片导到电脑后,名字全是一串数字和字母,根本不知道哪张是哪天拍的。
他说:“能不能把照片按拍摄日期和序号统一命名?”
“能。这节课就做这个。”
今天我们就用Python批量重命名照片——把杂乱的文件名改成“日期_序号”的格式。
1
获取照片的拍摄日期
先想一个问题:照片的拍摄日期藏在哪里?
你在电脑上右键一张照片,点“属性”,能看到“拍摄日期”这一栏。这个日期不是文件创建时间,而是照片真正被拍下的时间,它藏在照片文件内部的元数据里,专业的叫法是“EXIF信息”。
但是Python不会自动帮你读这个信息,它需要你告诉它去“问”照片文件。怎么问?用PIL这个库。我们这节课就先解决一个最基础的问题:如何从照片文件里把拍摄日期读出来。
先安装PIL:
pip install pillow
然后读取照片的拍摄日期,下面来看代码

代码解释:
`Image.open()`:打开图片文件。
`_getexif()`:提取EXIF数据(包含了拍摄时间、设备型号等信息)。
`exif` 是一个字典,`tag_id` 是数字编号,`value` 是对应的值。`TAGS` 把`DateTimeOriginal` 就是拍摄时间,格式是 `"年:月:日 时:分:秒"`。
注意:有些图片(如手机截图)没有EXIF信息,`get_taken_date` 会返回 `None`。
2
如果没有拍摄日期怎么办?
有些图片没有EXIF,那用什么?
你可能会遇到这种情况:手机截图、网页另存的图片、别人发给你的照片,它们往往没有EXIF信息。如果读取不到,程序就不知道该用什么日期来命名。
这时候需要有一个备用方案。每张图片在电脑里至少有一个属性是肯定有的:文件修改时间。它虽然不是拍摄时间,但至少能用来排序,也比你手动去翻文件属性要快得多。
所以这一节我们要做的逻辑是:优先读EXIF拍摄时间,如果没有,就用文件的修改时间来代替。。

代码解释:
`os.path.getmtime()` 获取文件的最后修改时间(时间戳格式),
`datetime.fromtimestamp()` 把它转成日期对象。
这样我们就有两层保障:能读到EXIF就用拍摄时间,读不到就用文件修改时间。基本上所有图片都能处理。
3
批量重命名——把东西“从哪来”变成“去哪”
现在有了每张照片的日期,下一步就是批量改名。
Tyree第一次听到“批量重命名”时,以为是一张一张改。我告诉他:不用那么麻烦。你把所有照片放一个文件夹里,让程序一口气全部处理完。
重命名的逻辑其实可以拆解成几个步骤:
1. 遍历文件夹,找出所有图片文件
2. 读取出每张照片的日期
3. 按日期排序(这样改名后顺序是对的)
4. 生成新文件名:日期 + 序号 + 扩展名
5. 执行改名
简单说:先找出所有照片,排好顺序,再一个一个改名。 跟老师点名一样,先数数班级里有几个人,排好座位,再依次叫名字。



代码解释:
`image_extensions`:支持常见的图片格式。
`os.listdir(folder_path)`:获取文件夹下所有内容。
`os.path.splitext(filename)[1].lower()`:获取扩展名并转小写。
`files.append((date, file_path, ext))`:把日期、完整路径、扩展名打包成元组存到列表。
`files.sort(key=lambda x: x[0])`:按日期排序,`lambda` 指定按元组的第一个元素(日期)排序。
`date.strftime("%Y-%m-%d")`:把日期转成 `2024-07-03` 这样的格式。
`{i:03d}`:序号用三位数字显示(001、002、003)。
`os.path.exists(new_path)`:检查新文件名是否已存在,避免覆盖。
`os.rename(file_path, new_path)`:执行重命名。
最终效果:
IMG_20240703_145632.jpg -> 旅行_2024-07-03_001.jpg
IMG_20240702_091234.jpg -> 旅行_2024-07-02_002.jpg
4
课后小挑战
挑战1:挑战1:在重命名时保留原文件名的一部分,比如 `IMG_20240703_145632.jpg` 变成 `2024-07-03_旅行_001.jpg`。
挑战2:增加一个“预览模式”,只打印新文件名但不执行重命名,确认无误后再执行。
5
今天学到了什么
- `PIL.Image`:读取图片并提取EXIF信息
- `os.path.getmtime()`:获取文件修改时间
- `os.rename()`:重命名文件
- `datetime.strftime()`:格式化日期
- 用 `while` 循环检测文件名冲突,避免覆盖已有文件
好了,今天课程就到这,明天我们学习:定时备份文件夹——让电脑自动备份重要文件,再也不怕误删。
————热门推荐————
自学编程第51课:爬虫入门让Python帮你从网页“拿”数据
自学编程第一步:安装Python和Thonny 零基础图文教程
本系列教程持续更新,欢迎关注收藏

点赞
收藏
分享