Скрипт сортирует фотографии и видео по году и месяцу съемки и копирует в соответствующую директорию.
Понадобится библиотека pillow: pip install pillow
import os
import shutil
from PIL import Image
from PIL.ExifTags import TAGS
from datetime import datetime
# Исходная папка с фотографиями и видео
SOURCE_DIR = r"D:\dir\dir"
# Папка, куда складывать отсортированные файлы
DEST_DIR = r"dir"
# Поддерживаемые форматы
PHOTO_EXTENSIONS = (".jpg", ".jpeg", ".png")
VIDEO_EXTENSIONS = (".mp4", ".avi", ".mov", ".mkv", ".wmv", ".flv", ".webm")
# Функция получения даты фото
def get_photo_date(photo_path):
try:
img = Image.open(photo_path)
exif_data = img._getexif()
if exif_data:
for tag, value in exif_data.items():
if TAGS.get(tag) == "DateTimeOriginal": # Дата съемки из EXIF
return datetime.strptime(value, "%Y:%m:%d %H:%M:%S")
except Exception as e:
print(f"Ошибка чтения EXIF {photo_path}: {e}")
# Если EXIF нет, берем дату создания файла
return datetime.fromtimestamp(os.path.getctime(photo_path))
# Функция получения даты видео
def get_video_date(video_path):
# У видео EXIF нет, поэтому берем дату создания файла
return datetime.fromtimestamp(os.path.getctime(video_path))
# Функция сортировки файлов
def sort_media(source_dir, dest_dir):
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
for root, _, files in os.walk(source_dir):
for file in files:
file_path = os.path.join(root, file)
file_ext = file.lower().endswith
if file_ext(PHOTO_EXTENSIONS): # Обработка фото
media_date = get_photo_date(file_path)
elif file_ext(VIDEO_EXTENSIONS): # Обработка видео
media_date = get_video_date(file_path)
else:
continue # Пропускаем файлы других форматов
if media_date:
year = str(media_date.year)
month = f"{media_date.month:02d}"
# Создаем папку: Год/Месяц
target_folder = os.path.join(dest_dir, year, month)
os.makedirs(target_folder, exist_ok=True)
# Перемещаем файл
shutil.move(file_path, os.path.join(target_folder, file))
print(f"{file} → {target_folder}")
# Запускаем сортировку
sort_media(SOURCE_DIR, DEST_DIR)
print("Сортировка завершена!")