说明:有一次自己瞎折腾,然后把服务器相册搞崩了,后来做了备份同步给找了回来,但是相册的时间线全乱了,看起来非常难受。所以就想通过文件夹的形式把照片重新分类
,分类后的结构如下(红色字体为文件夹):
未分类
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_time
if tag_name == 'DateTimeOriginal':
capture_time = value
break
print("照片:", 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打包文件下载