Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров11K


Всем знакомы завалы из фото и видео, кои покоятся годами после копирования с устройств.

Особенно это характерно для 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, который притупляет бдительность впечатлительных особ, получающих красноту в консоль.

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

Программа — скачать.
Теги:
Хабы:
Всего голосов 6: ↑4 и ↓2+4
Комментарии18

Публикации

Истории

Работа

Data Scientist
77 вакансий
Python разработчик
121 вакансия

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань