Как разложить фото, видео по папкам, исходя из их дат, используя python

от автора


Всем знакомы завалы из фото и видео, кои покоятся годами после копирования с устройств. Особенно это характерно для iphone,ipad, которые при прямом копировании (без itunes) создают
залежи медиаконтента. Как это все разложить по годам-месяцам?
Да, есть синхронизация, да, можно сразу все сортировать. Но…
Кто-то предпочитает ничего не трогать, так как соблюдается единство свалки, кто-то делает робкие попытки разложить все накопленное хотя бы по годам.

Бесспорно, через проводник, используя табличный вид, вручную не составит труда все это это раскидать, но начинаешь смотреть старые фото, и процесс затягивается.
Поэтому напишем простую программу, которая разложит файлы в папке по годам с месяцами в них:

Программа сама будет определять дату, «заглядывая» в дату изменения файла:

Почему используем дату изменения, а не дату создания файла?
Как правило, она более корректно указывает на дату файла, чем ее тезка.

Импорт модулей на старте:

import os,time import datetime import shutil 

Предложим пользователю скопировать путь (windows) к папке с файлами:

p=input('Скопируйте сюда путь к фото. Например: E:/\1') os.chdir(p) 

Введем функцию создания папок с месяцами от 01 до 12 (да простят мне отсутствие f’ строк):

#создаем папки месяцев от 01 до 12 def d():     for x in range (1,13):         if x>9:             if not os.path.exists(str(x)):                 os.makedirs(str(x))         else:             if not os.path.exists('0'+str(x)):                 os.makedirs('0'+str(x)) 

Следующая функция обработает дату, полученную с фото/видео файла:

def mod_date(file):     t = os.path.getmtime(file)     return datetime.datetime.fromtimestamp(t) 

Теперь, пройдясь по папке, программа соберет все расширения файлов, а заодно,
определит какой год у файла. Для каждого года будет создана своя папка, а в ней,
в свою очередь, будут созданы папки с месяцами:

a=[] #['AAE', 'MOV', 'JPG', 'PNG'] for root, dirs, files in os.walk(p):         for file in files:         if file[-3:] not in a:             a.append(file[-3:])         if file[-3:] in a:             year=str(mod_date(file))[:10][:4]                         if not os.path.exists(year):                 os.makedirs(year)             os.chdir(p+'/'+year)                         d()             os.chdir(p) 

*Таким образом можно раскидать по папкам файлы с совершенно разными (любыми) расширениями, а не только jpeg,mov,mkv.

Еще раз пройдемся по папке со свалкой фото, теперь уже перенося фото в соответствующие, вновь созданные папки:

try:     for root, dirs, files in os.walk(p):             for file in files:                 if file[-3:] in a:                     year=str(mod_date(file))[:10][:4]                                         month=str(mod_date(file))[:10][5:7] #месяц создания фото                     shutil.move(file, year+'/'+month+'/'+file) #перенос файла в папку except EnvironmentError:     ('Вроде готово') 

Так как программа завершается с ошибкой, в цикле не найдя последнего файла, что не влияет на ее корректное выполнение, используется костыль из try,except, который притупляет бдительность впечатлительных особ, получающих красноту в консоль.

ps. Пост не претендует на научность, но, возможно, кому-то поможет победить свалки фото/видео.

Программа — скачать.

ссылка на оригинал статьи https://habr.com/ru/post/516756/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *