Как на Python написать скрипт для автоматического переименования всех фотографий в папке по дате их создания из метаданных EXIF?
Для автоматического переименования фотографий по дате из EXIF-метаданных на Python удобнее всего использовать библиотеку `Pillow` (PIL) или `piexif`. Рассмотрим полноценный рабочий скрипт.
**Установка зависимостей**
Перед началом установите необходимые библиотеки:
pip install Pillow
**Полный скрипт**
python
import os
from PIL import Image
from PIL.ExifTags import TAGS
from datetime import datetime
def get_exif_date(filepath):
try:
img = Image.open(filepath)
exif_data = img._getexif()
if exif_data:
for tag_id, value in exif_data.items():
tag = TAGS.get(tag_id, tag_id)
if tag == ‘DateTimeOriginal’:
return datetime.strptime(value, ‘%Y:%m:%d %H:%M:%S’)
except Exception as e:
print(f’Ошибка чтения EXIF для {filepath}: {e}’)
return None
def rename_photos(folder_path):
extensions = (‘.jpg’, ‘.jpeg’, ‘.png’, ‘.tiff’)
files = [f for f in os.listdir(folder_path) if f.lower().endswith(extensions)]
counters = {}
for filename in files:
filepath = os.path.join(folder_path, filename)
date = get_exif_date(filepath)
if date:
base_name = date.strftime(‘%Y-%m-%d_%H-%M-%S’)
else:
base_name = ‘no_exif_’ + os.path.splitext(filename)[0]
print(f’Нет EXIF-даты: {filename}, используется оригинальное имя’)
ext = os.path.splitext(filename)[1].lower()
counter = counters.get(base_name, 0)
counters[base_name] = counter + 1
if counter == 0:
new_name = base_name + ext
else:
new_name = f'{base_name}_{counter}{ext}’
new_filepath = os.path.join(folder_path, new_name)
os.rename(filepath, new_filepath)
print(f’Переименовано: {filename} -> {new_name}’)
if __name__ == ‘__main__’:
folder = input(‘Введите путь к папке с фотографиями: ‘).strip()
if os.path.isdir(folder):
rename_photos(folder)
else:
print(‘Указанная папка не существует.’)
**Как работает скрипт**
1. Функция `get_exif_date` открывает изображение через Pillow и извлекает тег `DateTimeOriginal` из EXIF-данных.
2. Дата форматируется в строку вида `2024-06-15_14-30-00`.
3. Если несколько фото сделаны в одну секунду, к имени добавляется числовой суффикс (`_1`, `_2` и т.д.).
4. Файлы без EXIF-данных переименовываются с префиксом `no_exif_`.
**Важные замечания**
— Перед запуском сделайте резервную копию папки с фотографиями.
— Тег `DateTimeOriginal` содержит дату съёмки, `DateTime` — дату последнего редактирования. Используйте нужный.
— Для RAW-файлов (`.cr2`, `.nef`) может потребоваться библиотека `rawpy` или `exifread`.
— Если EXIF отсутствует полностью (скриншоты, изображения из интернета), скрипт корректно обрабатывает такие случаи.
Скрипт легко расширяется: можно добавить рекурсивный обход подпапок через `os.walk()`, логирование в файл или предварительный просмотр изменений без реального переименования (dry-run режим).
