怎样用Python自动分类整理照片?EXIF信息读取与分类
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习文章相关编程知识。下面本篇文章就来带大家聊聊《怎样用Python自动分类整理照片?EXIF信息读取与分类》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!
用Python自动分类整理照片的核心是读取EXIF信息并根据其内容创建文件夹移动文件。1. 安装Pillow库用于图像处理;2. 编写脚本读取照片的EXIF数据,提取拍摄日期并按年月创建文件夹进行分类;3. 对于无EXIF信息的照片,可使用文件修改时间、手动分类或结合图像识别技术处理,并建立“未分类”文件夹统一管理;4. 可扩展至根据相机型号分类,提取EXIF中的型号信息创建对应目录;5. 利用GPS信息按地理位置分类,借助exifread库读取经纬度并通过地理编码服务转换为地点名称;6. 优化效率方面,可采用多进程处理、批量操作、使用更快的图像库、避免重复读取以及使用SSD提升IO速度。

想要用Python自动分类整理照片?核心就在于读取照片的EXIF信息,然后根据这些信息(比如拍摄日期、相机型号等)来创建文件夹并移动照片。

解决方案:

首先,你需要安装一个叫做Pillow的Python库,它可以用来处理图像,包括读取EXIF信息。使用pip install Pillow安装。
接下来,就是编写Python脚本了。这是一个基本的例子:

from PIL import Image
import os
import shutil
def organize_photos(source_dir, dest_dir):
for filename in os.listdir(source_dir):
if filename.endswith(('.jpg', '.jpeg', '.png', '.gif')): # 检查文件类型
filepath = os.path.join(source_dir, filename)
try:
img = Image.open(filepath)
exif_data = img._getexif()
if exif_data:
# 提取拍摄日期,这里假设EXIF标签269对应日期时间
date_taken = exif_data.get(36867) or exif_data.get(306) # 36867是DateTimeOriginal,306是DateTime
if date_taken:
year_month = date_taken[:7].replace(":", "-") # 提取年月
target_dir = os.path.join(dest_dir, year_month)
os.makedirs(target_dir, exist_ok=True)
shutil.move(filepath, os.path.join(target_dir, filename))
print(f"Moved {filename} to {target_dir}")
else:
print(f"No date information found for {filename}")
else:
print(f"No EXIF data found for {filename}")
except Exception as e:
print(f"Error processing {filename}: {e}")
# 使用示例
source_directory = "/path/to/your/photos" # 替换为你的照片源目录
destination_directory = "/path/to/your/organized/photos" # 替换为你的目标目录
organize_photos(source_directory, destination_directory)这段代码会遍历指定目录下的所有图片,读取它们的EXIF信息,提取拍摄日期,然后根据年月创建文件夹,并将照片移动到对应的文件夹中。注意,EXIF信息的标签ID可能会因为相机型号而有所不同,你需要根据实际情况调整。
如何处理没有EXIF信息的照片?
有些照片可能没有EXIF信息,或者EXIF信息不完整。针对这种情况,你可以考虑以下几种方法:
使用文件修改日期: 如果EXIF信息缺失,可以退而求其次,使用文件的修改日期作为分类的依据。
os.path.getmtime()函数可以获取文件的修改时间戳,然后将其转换为日期格式。import time file_modified_time = os.path.getmtime(filepath) date_taken = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(file_modified_time))手动分类: 对于少量无法自动分类的照片,手动创建文件夹并移动它们可能是最直接的办法。
结合图像识别技术: 如果照片内容有明显特征(比如风景、人像),可以尝试使用图像识别技术来辅助分类。但这需要更复杂的算法和模型,例如使用OpenCV或者TensorFlow。
建立一个“未分类”文件夹: 将所有无法确定分类的照片都放到一个“未分类”文件夹中,稍后再手动处理。
如何根据相机型号或地理位置信息分类照片?
除了日期,你还可以根据相机型号或地理位置信息来分类照片。
根据相机型号分类: EXIF信息中通常包含相机型号的信息。你可以提取该信息,并根据相机型号创建文件夹。
camera_model = exif_data.get(272) # 272是Make,271是EquipmentMake,272是Model if camera_model: target_dir = os.path.join(dest_dir, str(camera_model)) os.makedirs(target_dir, exist_ok=True) shutil.move(filepath, os.path.join(target_dir, filename))根据地理位置信息分类: 有些照片包含GPS信息。你可以使用第三方库(比如
exifread)来读取这些信息,然后根据经纬度确定照片的拍摄地点,并根据地点创建文件夹。需要注意的是,处理GPS信息会稍微复杂一些,因为你需要将经纬度转换为可读的地点名称。可以使用地理编码服务,如Google Maps API,但可能需要付费。import exifread with open(filepath, 'rb') as f: tags = exifread.process_file(f) latitude = tags.get('GPS GPSLatitude') longitude = tags.get('GPS GPSLongitude') if latitude and longitude: # 这里需要将经纬度转换为地点名称,可以使用地理编码服务 location = get_location_from_coordinates(latitude, longitude) target_dir = os.path.join(dest_dir, location) os.makedirs(target_dir, exist_ok=True) shutil.move(filepath, os.path.join(target_dir, filename))
如何优化照片分类的效率?
如果你的照片数量非常庞大,那么分类过程可能会很慢。以下是一些优化效率的建议:
使用多线程或多进程: Python的
threading或multiprocessing模块可以让你并行处理多个照片,从而提高分类速度。但是要注意,多线程可能会受到全局解释器锁(GIL)的限制,对于CPU密集型任务,多进程可能更适合。批量处理: 不要一次处理一张照片,而是将照片分成批次,然后批量读取EXIF信息和移动文件。
使用更快的图像处理库: 虽然
Pillow很常用,但可能不是最快的图像处理库。你可以尝试其他的库,比如opencv-python,看看是否能提高速度。避免重复操作: 比如,如果已经读取了某个照片的EXIF信息,就不要再次读取。可以将EXIF信息缓存起来,下次直接使用。
使用固态硬盘(SSD): 如果你的照片存储在机械硬盘上,那么读取和写入速度可能会成为瓶颈。使用SSD可以显著提高速度。
总的来说,照片自动分类是一个很有趣的项目,它结合了文件操作、图像处理和数据分析。通过不断尝试和优化,你可以打造一个高效且智能的照片管理系统。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。
Golang测试如何验证并发安全性 演示并发测试的编写模式
- 上一篇
- Golang测试如何验证并发安全性 演示并发测试的编写模式
- 下一篇
- Golang微服务如何实现服务注册与发现 Golang微服务注册与发现的实现方法
-
- 文章 · python教程 | 1天前 | Python教程 · Python 鸭子类型 typing.Protocol 结构子类型
- Python typing.Protocol 约束鸭子类型接口
- 246浏览 收藏
-
- 文章 · python教程 | 2天前 | Python教程 · Python 相对路径 is_file pathlib Path.resolve
- Python pathlib 相对路径规范化与文件判断
- 144浏览 收藏
-
- 文章 · python教程 | 2天前 | python · 异步编程 · asyncio · Python CancelledError asyncio.timeout TimeoutError
- Python asyncio.timeout 嵌套取消与异常传播
- 373浏览 收藏
-
- 文章 · python教程 | 2天前 |
- Python heapq 最大堆 API 怎么避免手动取负数
- 397浏览 收藏
-
- 文章 · python教程 | 2天前 | python · Python 不可变对象 namedtuple dataclass copy.replace
- Python copy.replace 怎么更新不可变对象字段
- 245浏览 收藏
-
- 文章 · python教程 | 3天前 | python ·
- Python NamedTemporaryFile 的 delete_on_close 怎么设置
- 311浏览 收藏
-
- 文章 · python教程 | 3天前 |
- Python itertools.batched strict 参数什么时候会报错
- 306浏览 收藏
-
- 文章 · python教程 | 3天前 |
- Python ExceptionGroup split 怎么按异常类型拆分
- 311浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 279次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 334次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 328次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 297次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 117次使用
-
- Python sqlite3 Connection serialize 怎么导出数据库快照:备份窗口、内存占用与恢复校验
- 2026-08-26 501浏览
-
- Python监控网页状态:requests异常处理实战
- 2026-05-29 501浏览
-
- TensorFlow模型部署为API的TF Serving方法
- 2026-05-26 501浏览
-
- Python字符串编码转换:encode与decode详解
- 2026-05-16 501浏览
-
- TensorFlow裁剪无用算子方法详解
- 2026-05-15 501浏览
