尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python批量重命名照片:基于Exif时间戳的自动化方案

Python批量重命名照片:基于Exif时间戳的自动化方案 1. 项目背景与需求分析每次整理手机或相机里的照片时最让人头疼的就是那些杂乱无章的文件名。DCIM123.jpg、IMG_4567.png...这些默认生成的名称完全无法反映照片内容。更麻烦的是当你需要按时间顺序查找某张特定照片时往往要在文件属性中反复查看拍摄日期。这个工具正是为了解决这个痛点而生——它能自动读取照片内嵌的Exif元数据中的拍摄时间信息然后批量将照片重命名为YYYY-MM-DD_HH-MM-SS等规范化的时间格式。想象一下你从旅行带回的2000张照片3秒钟就能全部变成2023-08-15_14-30-22.jpg这样一目了然的名字。2. 技术实现原理2.1 Exif数据解析照片文件中隐藏的ExifExchangeable image file format数据就像数字胶卷上的隐形水印。通过Python的Pillow库可以提取这些元信息from PIL import Image from PIL.ExifTags import TAGS def get_exif(filepath): img Image.open(filepath) exif_data {} if hasattr(img, _getexif): exif img._getexif() if exif: for tag_id, value in exif.items(): tag TAGS.get(tag_id, tag_id) exif_data[tag] value return exif_data关键的时间标签是DateTimeOriginal原始拍摄时间其格式通常为YYYY:MM:DD HH:MM:SS。需要注意的是不同设备可能使用不同的Exif标签存储时间信息有些设备可能使用DateTimeDigitized数字化时间或DateTime修改时间。2.2 文件名规范化处理时间格式转换需要考虑以下细节替换原始字符串中的冒号为横杠更符合文件名规范处理时区差异建议统一转换为UTC时间处理没有时间信息的照片可fallback到文件创建时间from datetime import datetime def format_exif_time(exif_time_str): try: dt datetime.strptime(exif_time_str, %Y:%m:%d %H:%M:%S) return dt.strftime(%Y-%m-%d_%H-%M-%S) except (ValueError, TypeError): return None3. 完整实现方案3.1 基础版本代码以下是核心功能的Python实现import os from PIL import Image from PIL.ExifTags import TAGS from datetime import datetime def batch_rename_by_exif(input_folder, output_folder): if not os.path.exists(output_folder): os.makedirs(output_folder) supported_formats (.jpg, .jpeg, .png, .tiff, .nef) for filename in os.listdir(input_folder): if filename.lower().endswith(supported_formats): filepath os.path.join(input_folder, filename) try: exif get_exif(filepath) time_str exif.get(DateTimeOriginal) or \ exif.get(DateTimeDigitized) or \ exif.get(DateTime) if time_str: new_name format_exif_time(time_str) if new_name: ext os.path.splitext(filename)[1].lower() new_filename f{new_name}{ext} os.rename( filepath, os.path.join(output_folder, new_filename) ) except Exception as e: print(fError processing {filename}: {str(e)}) # 使用示例 batch_rename_by_exif(~/Photos/Raw, ~/Photos/Sorted)3.2 高级功能扩展实际使用中你可能还需要这些功能冲突处理当多张照片同一秒拍摄时自动追加序号from collections import defaultdict name_counter defaultdict(int) # 在重命名逻辑中添加 while os.path.exists(new_path): name_counter[new_name] 1 new_filename f{new_name}_{name_counter[new_name]}{ext}自定义命名模板def generate_filename(template, dt, camera_modelNone): return template.replace({YYYY}, dt.strftime(%Y)) \ .replace({MM}, dt.strftime(%m)) \ .replace({DD}, dt.strftime(%d)) \ # ...其他占位符处理并行处理加速from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers4) as executor: executor.map(process_file, file_list)4. 常见问题与解决方案4.1 Exif数据缺失当照片没有Exif信息时可以按以下优先级回退文件系统创建时间os.path.getctime()文件修改时间os.path.getmtime()自定义默认时间或提示用户手动处理4.2 时区处理不同设备可能在不同时区拍摄照片建议import pytz def adjust_timezone(naive_dt, timezoneUTC): return naive_dt.replace(tzinfopytz.UTC).astimezone( pytz.timezone(timezone) )4.3 性能优化处理数万张照片时先扫描所有文件生成任务列表使用内存缓存已处理的文件名显示进度条如tqdm库5. 实际应用建议预处理检查先用小样本测试确认时间提取准确率备份原始文件建议先复制到新目录再重命名日志记录记录所有重命名操作以便回滚import logging logging.basicConfig(filenamerename.log, levellogging.INFO)对于摄影爱好者可以进一步扩展功能按拍摄设备分类Exif中的Make和Model字段按GPS地理位置创建文件夹结构与Lightroom等专业软件集成这个工具虽然原理简单但能节省大量整理照片的时间。我自己用它处理过3万多张家庭照片从混乱的IMG_xxx命名变成了完善的时间线档案找照片效率提升了至少10倍。
返回列表