python脚本将照片按时间线整理

说明:有一次自己瞎折腾,然后把服务器相册搞崩了,后来做了备份同步给找了回来,但是相册的时间线全乱了,看起来非常难受。所以就想通过文件夹的形式把照片重新分类,分类后的结构如下(红色字体为文件夹):

未分类
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打包文件下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/448382.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openmax

通过EmptyThisBuffer传递未解码的buffer给component,component收到该命令后会去读取input port buffer中的数据,将其组装为帧之后进行解码,buffer处理完成后会通过EmptyBufferDone通知上层输入使用完成,上层收到命令可以继续送输入…

Duplicate entry ‘2020045-2-1‘ for key ‘index_uid‘ 解决方案

项目场景: 今天小编在工作中编写接口对数据库增加相同的非主键数据的时候,突然出现了这样的一个错误: 下面我来给大家解答这个错误的出现原因以及解决办法。 问题描述 Duplicate entry 2020045-2-1 for key index_uid 这个错误大概意思就是…

举个栗子!Tableau 技巧(263):按需突出显示文本表的 N 个行

我们分享过 🌰 :突出显示文本表的行或列,可以突出显示文本表中的某一行或某一列。有数据粉提出新的问题:如果想突出显示多行数据,该如何实现呢? 在 Tableau 中是可以实现的(如上图)&…

MySQL主从同步

一、配置主服务器 1、更改配置文件 vi /etc/my.cnf [mysqld] server_id100 log-bin/mnt/data/mysql8_data/log-bin 2、重启MySQL service mysql restart 3、创建主从同步用户 CREATE USER rep% IDENTIFIED BY Future2050; GRANT REPLICATION SLAVE ON *.* TO rep%; 4、查询Mas…

Linux下find命令详解

find #查找文件 #按照文件名、大小、时间、权限、类型、所属者、所属组来搜索文件 格式: find 查找路径 查找条件 具体条件(按文件名或时间大小等) 操作 注意: find命令默认的操作是print输出 find是检索…

2024/2/2学习记录

Mock.js Mock.mock(template) 根据数据模板生成模拟数据 Mock.mock(rurl,template) 记录数据模板,当拦截到 rurl 的 ajax 请求时,将根据数据模板 template 生成模拟数据,并作为响应数据 返回 Mock.mock(rurl,function(options)) 记…

OpenCV-Python图形图像处理:自用的一些工具函数源代码(统信UOS Linux版)

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 在《OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍》介绍了笔者自用的一些函数的语法及功能,在《OpenCV-Python图形图像处理:自用的一些工具函数源代码》介绍了老猿实现的代…

代码随想录算法训练营DAY10 | 栈与队列 (1)

理论基础及Java实现参考文章:栈和队列 一、LeetCode 232 用栈实现队列 题目链接:232.用栈实现队列https://leetcode.cn/problems/implement-queue-using-stacks/ 思路:使用两个栈stack1、stack2实现队列;stack1用来存储入队元素&…

元素的显示与隐藏,精灵图,字体图标,CSSC三角

元素的显示与隐藏 类似网站广告,当我们点击关闭就不见了,但是我们重新刷新页面,会重新出现 本质:让元素在页面中隐藏或者显示出来。 1.display显示隐藏 2.visibility显示隐藏 3.overflow溢出显示隐藏 1.display属性(…

QT研究笔记(二)Qt 5.14.2 简单使用-使用vs2022创建第一个QT项目

前一篇文章,我们介绍了什么是Qt ?为什么要使用Qt?以及Qt在windows 环境下的安装和部署。喜欢的小伙伴,可以前往查看。 QT研究笔记(一)windows 开发环境安装部署。 从这篇文章开始,我们正式开始…

django+flask警务案件信息管理系统python-5dg53-vue

1)用户在后台页面各种操作可及时得到反馈。 (2)该平台是提供给多个用户使用的平台,警员使用之前需要注册登录。登录验证后,警员才可进行各种操作[10]。 (3)管理员用户拥有信息新增,修…

基于SpringBoot Vue学生成绩管理系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…