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.mzph.cn/news/663063.shtml

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

相关文章

item_get-根据ID取商品详情(shopee.item_get):跨境电商的未来趋势

根据您的需求,我为您撰写了一篇关于“item_get-根据ID取商品详情(shopee.item_get):跨境电商的未来趋势”的文章。由于篇幅限制,我将提供文章的概要和部分内容,完整的文章将需要更多细节和展开。 item_get-根据ID取商品详情(shope…

《区块链简易速速上手小册》第7章:区块链在其他行业的应用(2024 最新版)

文章目录 7.1 供应链管理7.1.1 供应链管理中区块链的基础7.1.2 主要案例:食品安全追踪7.1.3 拓展案例 1:制药供应链7.1.4 拓展案例 2:汽车行业的零部件追踪 7.2 区块链在医疗保健中的应用7.2.1 医疗保健中区块链的基础7.2.2 主要案例&#xf…

今天聊聊软件研发部门孵化策略

声明:上述内容纯属个人瞎说,如有雷同请联系删除。 引:公司研发二部的同事召回来了,这边先恭喜他们荣耀而归。大家都欢心鼓舞、人事嘘寒问暖、综合端盘倒水;真热闹……。我们部门的同事就在边上办公,感触很深…

如何处理缓存一致性问题

* 如何解决缓存一致性问题 * 1. 更新缓存 * ①先更新缓存,再更新数据库. 如果先更新缓存成功了,但是更新数据库失败了,那么数据库将出现脏数据,否掉 * ②先更新数据库,再更新缓存. 如果先更新数据库,但更…

1451A/D/F捷变信号发生器

01 1451A/D/F捷变信号发生器 产品综述: 1451系列捷变信号发生器采用直接数字合成(DDS)技术和直接模拟合成技术(ADS)相结合的设计方案,实现覆盖10MHz~3/20/40GHz全频段的频率捷变,捷变时间小于…

UMI初始化脚手架 Simple App、 Ant Design Pro、Vue Simple App、Umi Plugin 4者的区别

这四个概念分别代表不同的工具和框架,它们的主要区别如下: Simple App:这通常指的是一个基础的、最小化的应用程序。它可能只包含最基础的功能,如用户界面、一些简单的交互等。这种应用程序通常用于学习和实验目的,或者…

分布式事务(四)——TCC补偿模式解决方案

系列目录: 《分布式事务(一)—— 事务的基本概念》 《分布式事务(二)—— CAP和Base理论》 《分布式事务(三)—— 两阶段提交解决方案(2PC)》 一、常见分布式事务解决…

Android selinux调试(rk3588 android 12平台)

Android selinux调试(rk3588 android 12平台): 参考文档: Android系统10 RK3399 init进程启动(二十七) Selinux Type和Attribute https://www.jb51.net/article/277418.htm Android selinux策略文件的编译与加载 https://c.biancheng.net/view/1151.h…

WPF DataTemplate内重写BorderBrush,VisualBrush内数据源绑定提示绑定失败

定义DataTemplate 数据模板文件&#xff0c;内容如下 <DataTemplate x:Key"{DataTemplateKey {x:Type VM:TemplateListVM}}" DataType"{x:Type VM:TemplateListVM}"> <Grid Margin"0" Grid.Row"3" Height"50" Ver…

python:lxml 生成思维导图 Freemind(.mm)文件

请参阅&#xff1a;从PDF中提取目录 或者 java : pdfbox 读取 PDF文件内书签 pip install lxml ; lxml-5.1.0-cp310-cp310-win_amd64.whl (3.9 MB) 读目录.txt文件&#xff0c;使用 lxml 生成思维导图 Freemind&#xff08;.mm&#xff09;文件 编写 txt_etree_mm.py 如下…

QML自定义ComboBox组件,支持动态筛选

QtQuick.Controls提供了ComboBox组件&#xff0c;该组件能够满足日常的下拉选择框的需求&#xff0c;但当需要用户在ComboBox中通过输入关键字进行自动匹配时&#xff0c;原生的组件虽然提供了editable属性用于输入关键字&#xff0c;但是匹配内容不弹出下拉框&#xff0c;无法…

03、全文检索 -- Solr -- Solr 身份验证配置(给 Solr 启动身份验证、添加用户、删除用户)

目录 全文检索 -- Solr -- Solr 身份验证配置启用身份验证&#xff1a;添加用户&#xff1a;删除用户&#xff1a; 全文检索 – Solr – Solr 身份验证配置 学习之前需要先启动 Solr 执行如下命令即可启动Solr&#xff1a; solr start -p <端口>如果不指定端口&#xf…

7-2.递归思想代码练习题

例题1.按顺序打印一个数据的每一位 1234 输出 1 2 3 4 解决问题的思路 如何拿到这个数的每一位 1234%104 1234/10123 123%103 123/1012 12%102 12/101 1%101 递推公式&#xff1a;%10 /10 初始条件&#xff1a;1-9之间的数直接打印&#xff08;n<10&#xff09; n>10 进行…

最近nvm安装报错的原因找到了——npm原淘宝镜像正式到期!

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 错误原因 问题排查 淘宝镜像 证书到期 问题解决 结语 背景 我们…

HAL库配置CAN通信

一、CAN总线波特率计算 CAN总线通信的各节点通信时会产生相位差&#xff0c;所以要进行位同步&#xff0c;两个节点保持步调一致。 CAN_SJW&#xff1a;重新同步跳跃宽度(SJW) 。定义了在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。 CAN_BS1&a…

centos7 安装nacos

在 CentOS 7 上安装 Nacos 的步骤可以概括如下&#xff1a; 前提条件&#xff1a; 安装Java环境&#xff1a;Nacos依赖于Java 8或以上版本&#xff0c;确保系统已安装Java。可以通过以下命令检查和安装&#xff08;假设使用OpenJDK&#xff09;&#xff1a; # 检查是否已安装…

【数据分享】1929-2023年全球站点的逐日最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2023年全球气象站…

【AudioPolicy To AudioHAL笔记(一)】AudioPolicy启动过程

AudioPolicy启动过程 一、总体启动过程二、代码分析三、动态分析 /*****************************************************************************************************************/ 声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创&#xff0c;转载or…

week03day04(正则表达式2)

一. 正则表达式 1. 匹配次数相关的正则符号 a. 一次或多次(至少一次) &#xff0c;控制 前面元素的次数&#xff0c;看下面事例 from re import fullmatch a 至少一个a , \d 至少一个数字字符 result fullmatch(r1a2,1aaaaaaaa2) #1和2中间至少要有一个a…

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

内网情况配置 wsl 和 vscode。在wsl中下载不了 vscode 的核心。 报错&#xff1a; ERROR: Faild to download https://update.code.visualstudio.com/commit:8b3775030ed1a69b13e4f4c628c612102e30a681/server-linux-x64/stable 很多情况下是没有现成的VS Code Server程序的&…