Pull to refresh

Comments 34

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

Copy Source | Copy HTML
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. """ sorts images by resolution"""
  4.  
  5.  
  6. import os,sys
  7. import time
  8.  
  9. dirname = os.path.abspath(sys.argv[1])
  10. try:
  11.     newdir = os.path.abspath(sys.argv[2])
  12. except:
  13.     newdir = dirname
  14.  
  15.  
  16. def image_sort(dirname, newdir, recur= 0):
  17.     if not recur:print 'sorting started ...'
  18.     else: print 'sorting started in %s...'%dirname
  19.     if not newdir: newdir = dirname
  20.  
  21.     imagelist = []
  22.  
  23.     if os.path.isdir(dirname):
  24.         for x in os.listdir(dirname):
  25.             absx = dirname+os.sep+x
  26.             if os.path.isfile(absx):imagelist.append(absx)
  27.             else:
  28.                 image_sort(absx, newdir+os.sep+x,recur=1)
  29.         for name in imagelist:
  30.             try:
  31.                 file_date = time.localtime(os.stat(name).st_mtime)
  32.             except EnvironmentError, error:
  33.                 print 'seems error: %s with '%error, name, '/n'
  34.                 continue
  35.             imdir = '%s--%s--%s'%(file_date.tm_year,file_date.tm_mon,file_date.tm_mday)
  36.             imdir = os.path.join(newdir,imdir)
  37.             if os.path.split(dirname)[-1] == os.path.split(imdir)[-1]:
  38.                 continue
  39.             elif not os.path.exists(imdir):
  40.                 print 'making dir %s'%imdir
  41.                 os.mkdir(imdir)
  42.             try:
  43.                 os.system('move "%s" "%s"'%(name,imdir))
  44.             except EnvironmentError:
  45.                 print 'error with '+ name, '/n'
  46.     if not recur:print 'sorting completed!'
  47.  
  48. if __name__ == '__main__':
  49.     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)

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

Поясните эти моменты, если не сложно.
Ваш вариант обработки исключиний «хороший». Нужно ловить только то что можешь обработать, остальное нужно идти на обработку обработчику верхнего уровня или обработчику по умолчанию если нет такого, который «положит» програму. А совет ловить все исключения в корне неправилен и за такое нужно железной линейкой по пальцам, единственное исключение, можна на самом верхнем уровне поставить обработчик того что уже никто не обработает, который непоготовленому пользователю выдаст «програма упала свяжитесь с поддержкой», а сам прологирует событие и «положит» програму.
UFO just landed and posted this here
Честно говоря, думал что одинарные и двойные кавычки в питоне как раз для того, чтобы избежать их экранирования.
UFO just landed and posted this here
Благодаря таким как вы… — я потихоньку изучаю питон.
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)?
Sign up to leave a comment.

Articles