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

Комментарии 34

НЛО прилетело и опубликовало эту надпись здесь
Молодец! Нашёл к чему придраться!
НЛО прилетело и опубликовало эту надпись здесь
Я рад что вы скурпулёзно просмотрели код. :)
*скрупулёзно
лучше уж избегать проблем связанных с различными файловыми/операционными системами
к примеру в Windows в имени файла запрещено использование некоторых служебных символов: «\», «/», «:», «*», «?», «"», «<», «>», «|». как с «×» не знаю (да и проверить не на чем)
это не служебный символ, но проблемы со старыми программами, не дружащими с Юникодом, могут быть
C «×» всё нормально, на многих файловых системах есть ограничения, они носят исторический характер, но новые Unicode-символы (если файловая система поддерживает Unicode) в эти ограничения не попадают.
А есть ли что-то подобное, но только чтоб упорядочить фотографии по дате создания?
Сорри, не на тот коммент ответил.
тык
Вот, попробуйте, подправил код выше ( правда сортирует все файлы а не только картинки :) ):

Copy Source | Copy HTML
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. """ sorts images by resolution"""
  4. import os,sys
  5. import time
  6. dirname = os.path.abspath(sys.argv[1])
  7. try:
  8. newdir = os.path.abspath(sys.argv[2])
  9. except:
  10. newdir = dirname
  11. def image_sort(dirname, newdir, recur= 0):
  12. if not recur:print 'sorting started ...'
  13. else: print 'sorting started in %s...'%dirname
  14. if not newdir: newdir = dirname
  15. imagelist = []
  16. if os.path.isdir(dirname):
  17. for x in os.listdir(dirname):
  18. absx = dirname+os.sep+x
  19. if os.path.isfile(absx):imagelist.append(absx)
  20. else:
  21. image_sort(absx, newdir+os.sep+x,recur=1)
  22. for name in imagelist:
  23. try:
  24. file_date = time.localtime(os.stat(name).st_mtime)
  25. except EnvironmentError, error:
  26. print 'seems error: %s with '%error, name, '/n'
  27. continue
  28. imdir = '%s--%s--%s'%(file_date.tm_year,file_date.tm_mon,file_date.tm_mday)
  29. imdir = os.path.join(newdir,imdir)
  30. if os.path.split(dirname)[-1] == os.path.split(imdir)[-1]:
  31. continue
  32. elif not os.path.exists(imdir):
  33. print 'making dir %s'%imdir
  34. os.mkdir(imdir)
  35. try:
  36. os.system('move "%s" "%s"'%(name,imdir))
  37. except EnvironmentError:
  38. print 'error with '+ name, '/n'
  39. if not recur:print 'sorting completed!'
  40. if __name__ == '__main__':
  41. image_sort(dirname, newdir)
Ещё для пущей крастоты можно заменить строчку

imdir = '%s--%s--%s'%(file_date.tm_year,file_date.tm_mon,file_date.tm_mday)
на
imdir = '%s--%02d--%02d'%(file_date.tm_year,file_date.tm_mon,file_date.tm_mday)
Интересная практика — править свой же код в комментариях к своей же статье со своим же кодом:)
А вообще скриптик может быть полезным…
если бы можно было править комменты, было бы намного удобнее.
Поправьте меня, если я не прав, но может лучше вместо вызова внешней утилиты move использовать функцию move из библиотеки shutil?
Да, будет лучше. Я все искал безуспешно эту функцию в модуле os, незнал что её запихали в такие дебри :)
дело не в быдло-коде, а в самой логике и ф-ционале
1) сделать выбор (перемещать существующие изображение или только скопировать в сортируемую диру)
2) перемещение файла не на всех ОСь move (mv)
3) опционально сделать выбор между:
а) ложим все изображения рекурсивно по дирам (вид images/sort/10x10; images/sort/subdir/10x20)
б) пихаем со всех субдир в одну сортируемую диру по разрешению изображений (images/sort/10x10, images/sort/10x20)

если это реализовать, будет уже на что то похоже
я бы на вашем месте эту пренебрежительно оторванную от сердца фразу про быдлокод убрал бы, ну или хотябы изменил, никто не идеален
Надеюсь новый вариант не слишком пафосен? :)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Спасибо за указания на недочеты и лишнее \n. Насчет Exception: насколько я знаю то при таком указании получится, что исключения возбуждаемые sys.exit() тоже будут перехватываться, а это вроде как не очень хорошо. А насчет кавычек, не пойму зачем их экранировать ведь они разные.

Поясните эти моменты, если не сложно.
Ваш вариант обработки исключиний «хороший». Нужно ловить только то что можешь обработать, остальное нужно идти на обработку обработчику верхнего уровня или обработчику по умолчанию если нет такого, который «положит» програму. А совет ловить все исключения в корне неправилен и за такое нужно железной линейкой по пальцам, единственное исключение, можна на самом верхнем уровне поставить обработчик того что уже никто не обработает, который непоготовленому пользователю выдаст «програма упала свяжитесь с поддержкой», а сам прологирует событие и «положит» програму.
НЛО прилетело и опубликовало эту надпись здесь
Честно говоря, думал что одинарные и двойные кавычки в питоне как раз для того, чтобы избежать их экранирования.
НЛО прилетело и опубликовало эту надпись здесь
Благодаря таким как вы… — я потихоньку изучаю питон.
absx = dirname+os.sep+x

Вы же ниже используете os.path.join, зачем тут такой изворот? :)
ну и
elif not os.path.exists(imdir):

лучше
elif not os.path.isdir(imdir):
А тут можно проследить мою миниэволюцию ) Сначала написал с конкатенацией, потом понял что можно os.path.join, но не везде исправил, неуглядел.
я тоже считаю, что отработал своюй 7ап :)
А можно модернизировать скрипт: задавать 2 директории(откуда и куда) а также смотреть соотнощение сторон и сувать это на первый уровень (16:9/1280x720)?
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.