本文目录导读:

我来帮你创建一个批量修改照片拍摄日期的脚本,这里提供几种常用的方案:
使用 Python + Pillow(最常用)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量修改照片拍摄日期脚本
支持格式:JPEG, PNG, TIFF 等
"""
import os
import sys
from datetime import datetime
from PIL import Image
from PIL.ExifTags import TAGS
import shutil
def get_exif_date(img):
"""获取照片的拍摄日期"""
try:
exif = img._getexif()
if exif:
for tag_id, value in exif.items():
tag = TAGS.get(tag_id, tag_id)
if tag == "DateTimeOriginal":
return value
elif tag == "DateTimeDigitized":
return value
except:
pass
return None
def modify_exif_date(file_path, new_date, output_dir=None):
"""
修改照片拍摄日期
参数:
file_path: 照片路径
new_date: 新的日期时间(datetime对象)
output_dir: 输出目录(None则覆盖原文件)
"""
try:
# 打开图片
img = Image.open(file_path)
# 获取exif数据
if hasattr(img, '_getexif'):
exif_data = img._getexif()
else:
exif_data = {}
# 如果没有exif,创建新的
if not exif_data:
exif_data = {}
# 转换日期格式
date_str = new_date.strftime("%Y:%m:%d %H:%M:%S")
# 更新相关EXIF标签
# DateTimeOriginal - 拍摄时间
# DateTimeDigitized - 数字化时间
# DateTime - 修改时间
exif_data[36867] = date_str # DateTimeOriginal
exif_data[36868] = date_str # DateTimeDigitized
exif_data[306] = date_str # DateTime
# 保存修改后的exif
if output_dir:
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, os.path.basename(file_path))
else:
output_path = file_path
# 保存图片
img.save(output_path, exif=exif_data)
img.close()
print(f"✅ 已修改: {os.path.basename(file_path)}")
return True
except Exception as e:
print(f"❌ 修改失败 {os.path.basename(file_path)}: {str(e)}")
return False
def process_folder(input_folder, new_date, output_folder=None, extensions=None):
"""
批量处理文件夹中的照片
参数:
input_folder: 输入文件夹路径
new_date: 新的拍摄日期
output_folder: 输出文件夹(可选)
extensions: 允许多文件扩展名列表
"""
if extensions is None:
extensions = ['.jpg', '.jpeg', '.png', '.tiff', '.bmp']
# 转换为小写比较
extensions = [ext.lower() for ext in extensions]
# 获取所有图片文件
files = []
for file in os.listdir(input_folder):
file_ext = os.path.splitext(file)[1].lower()
if file_ext in extensions:
files.append(file)
if not files:
print("❌ 未找到支持的图片文件")
return
print(f"找到 {len(files)} 张图片")
success_count = 0
fail_count = 0
for file in files:
file_path = os.path.join(input_folder, file)
if modify_exif_date(file_path, new_date, output_folder):
success_count += 1
else:
fail_count += 1
print(f"\n📊 统计结果:")
print(f" 成功: {success_count} 张")
print(f" 失败: {fail_count} 张")
def main():
"""主函数 - 交互式界面"""
print("="*50)
print("📷 批量修改照片拍摄日期工具")
print("="*50)
# 输入文件夹路径
input_folder = input("请输入图片文件夹路径: ").strip()
# 检查文件夹是否存在
if not os.path.exists(input_folder):
print(f"❌ 文件夹不存在: {input_folder}")
return
# 输入新的日期
date_input = input("请输入新的拍摄日期 (格式: YYYY-MM-DD HH:MM:SS): ").strip()
try:
new_date = datetime.strptime(date_input, "%Y-%m-%d %H:%M:%S")
except ValueError:
print("❌ 日期格式错误,请使用 YYYY-MM-DD HH:MM:SS 格式")
return
# 是否备份
backup = input("是否备份原文件?(y/n): ").strip().lower()
output_folder = None
if backup == 'y':
output_folder = os.path.join(input_folder, "modified_" + datetime.now().strftime("%Y%m%d_%H%M%S"))
print(f"备份目录: {output_folder}")
# 执行批量修改
process_folder(input_folder, new_date, output_folder)
print("\n✨ 操作完成!")
if __name__ == "__main__":
main()
使用 exiftool(最专业)
如果你的系统安装了 exiftool,可以使用更专业的方案:
#!/bin/bash
# 批量修改照片日期 - exiftool 版本
# 使用方法:修改以下变量
PHOTO_DIR="/path/to/your/photos" # 图片文件夹路径
NEW_DATE="2024:01:01 12:00:00" # 新的日期时间
# 批量修改所有 JPG 文件
find "$PHOTO_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) -exec exiftool -DateTimeOriginal="$NEW_DATE" -DateTimeDigitized="$NEW_DATE" -DateTime="$NEW_DATE" {} \;
命令行版本(带参数)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
命令行版本:批量修改照片拍摄日期
用法: python modify_date.py <文件夹路径> "2024-01-01 12:00:00"
"""
import sys
import os
from datetime import datetime
def modify_photo_date(file_path, new_date_str):
"""修改单张照片的日期"""
from PIL import Image
from PIL.ExifTags import TAGS
try:
# 解析日期
new_date = datetime.strptime(new_date_str, "%Y-%m-%d %H:%M:%S")
date_str = new_date.strftime("%Y:%m:%d %H:%M:%S")
# 打开并修改
img = Image.open(file_path)
exif_data = img._getexif() if hasattr(img, '_getexif') else {}
# 添加或修改EXIF日期标签
exif_data[36867] = date_str # DateTimeOriginal
exif_data[36868] = date_str # DateTimeDigitized
exif_data[306] = date_str # DateTime
# 保存
img.save(file_path, exif=exif_data)
img.close()
print(f"✅ {os.path.basename(file_path)} -> {new_date_str}")
return True
except Exception as e:
print(f"❌ {os.path.basename(file_path)}: {str(e)}")
return False
def main():
if len(sys.argv) != 3:
print("用法: python modify_date.py <文件夹路径> 'YYYY-MM-DD HH:MM:SS'")
sys.exit(1)
folder_path = sys.argv[1]
new_date_str = sys.argv[2]
# 验证日期格式
try:
datetime.strptime(new_date_str, "%Y-%m-%d %H:%M:%S")
except ValueError:
print("❌ 日期格式错误,请使用 YYYY-MM-DD HH:MM:SS 格式")
sys.exit(1)
# 支持的扩展名
extensions = ['.jpg', '.jpeg', '.png', '.tiff', '.bmp']
# 处理所有图片
count = 0
for file in os.listdir(folder_path):
if os.path.splitext(file)[1].lower() in extensions:
if modify_photo_date(os.path.join(folder_path, file), new_date_str):
count += 1
print(f"\n✨ 成功修改 {count} 张照片")
if __name__ == "__main__":
main()
使用说明
安装依赖
pip install Pillow
交互式使用
python modify_photos.py
命令行使用
python modify_date.py /path/to/photos "2024-01-01 12:00:00"
如果需要 exiftool
# Ubuntu/Debian sudo apt-get install exiftool # macOS brew install exiftool
注意事项
- 备份文件:脚本默认会直接修改原文件,建议先用副本测试
- EXIF 信息:部分相机形成的图片可能包含多个日期字段
- 文件权限:确保脚本有足够的文件读写权限
- 批量处理:建议先测试少量文件,确认效果后再批量处理
需要我帮你调整脚本功能吗?
- 添加日期偏移(批量加上/减去天数)
- 根据文件名解析日期
- 支持更多图片格式
- 添加 GUI 界面