说明:有一次自己瞎折腾,然后把服务器相册搞崩了,后来做了备份同步给找了回来,但是相册的时间线全乱了,看起来非常难受。所以就想通过文件夹的形式把照片重新分类
,分类后的结构如下(红色字体为文件夹):
未分类
2023
├── 202301
│ ├── 图片1.jpg
│ ├── 图片2.jpg
│ └── 图片3.jpg
├── 202302
│ ├── 图片4.jpg
│ ├── 图片5.jpg
│ └── 图片6.jpg
└── …
├── …
├── …
└── …
2024
├── 202401
│ ├── 图片1.jpg
│ ├── 图片2.jpg
│ └── 图片3.jpg
├── 202402
│ ├── 图片4.jpg
│ ├── 图片5.jpg
│ └── 图片6.jpg
└── …
├── …
├── …
└── …
import os
import shutil
from PIL import Image
from PIL.ExifTags import TAGS# 定义支持的照片格式
supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff']# 获取当前脚本文件的绝对路径
script_path = os.path.abspath(__file__)# 获取当前脚本文件的所在目录的上级目录
directory = os.path.dirname(os.path.dirname(script_path))# 脚本所在目录的路径下创建程序处理的照片的根文件夹
done_photos_folder = os.path.join(directory, 'done_photos')
os.makedirs(done_photos_folder, exist_ok=True)# 创建未归类文件夹
unclassified_folder = os.path.join(done_photos_folder, '未归类')
os.makedirs(unclassified_folder, exist_ok=True)def process_photos(directory_path):# 遍历目录中的所有文件和目录for filename in os.listdir(directory_path):# 构建完整的文件或目录路径path = os.path.join(directory_path, filename)if os.path.isfile(path):# 获取文件的扩展名file_ext = os.path.splitext(filename)[1].lower()# 如果文件是照片格式,则读取其信息if file_ext in supported_formats:process_photo(path)elif os.path.isdir(path):# 处理子目录中的照片process_photos(path)def process_photo(file_path):# 如果file_path包含“done_photos”则不处理if "done_photos" in file_path or "photo_demo" in file_path:return# 打开图片image = Image.open(file_path)# 获取图片的Exif信息exif_data = image._getexif()# 默认拍摄时间为未归类capture_time = "未归类"# 遍历Exif信息if exif_data:for tag_id, value in exif_data.items():# 将标签ID转换为标签名tag_name = TAGS.get(tag_id, tag_id)# 如果标签名为DateTimeOriginal,则将拍摄时间赋值给capture_timeif tag_name == 'DateTimeOriginal':capture_time = valuebreakprint("照片:", file_path)print("拍摄时间:", capture_time)if capture_time != "未归类":# 提取拍摄年份和月份year = capture_time[:4]month = capture_time[5:7]# 创建年份文件夹year_folder = os.path.join(done_photos_folder, year)os.makedirs(year_folder, exist_ok=True)print("创建年份文件夹:", year_folder)# 创建月份文件夹month_folder = os.path.join(year_folder, year + month)os.makedirs(month_folder, exist_ok=True)print("创建月份文件夹:", month_folder)# 构建最终存放照片的文件路径final_path = os.path.join(month_folder, os.path.basename(file_path))else:# 未归类文件的存放路径final_path = os.path.join(unclassified_folder, os.path.basename(file_path))try:# 复制照片到相应的文件夹中shutil.copy2(file_path, final_path)print("复制照片到:", final_path)except Exception as e:print("无法复制照片:", e)print()if __name__ == '__main__':process_photos(directory)
或者直接使用python脚本执行也可以。打包文件photo_demo下photo_demo.exe
的可执行文件为pyinstaller photo_demo.py
命令打包,不含病毒,如果有报毒请自行斟酌。
注意:代码仅做了简单测试,各位客官按需服用
如果是使用photo_demo打包文件执行,会将photo_demo所在目录作为作为扫描起始目录,即扫描该目录下的所有图片,并在该目录下创建:未分类
、20XX
等分类目录。如果是使用脚本的话请自行调试
photo_demo打包文件下载