Всем знакомы завалы из фото и видео, кои покоятся годами после копирования с устройств.
Особенно это характерно для 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.: Пост не претендует на научность, но, возможно, кому-то поможет победить свалки фото/видео.
Программа — скачать.