Из недавнего отпуска я привез около 500 фотографий (цифровых, конечно, не на пленках :-) ). Сегодня принялся приводить их в порядок: удалять ненужные и распределять оставшиеся в директории по дням отпуска. Кто этим занимался знает, что делать это вручную слегка муторно, особенно сливать в одну папку файлы из двух разных заходов фотографирования, когда у них в исходных директориях совпадают имена. А вот удобной утилитки для этого я как-то не знаю...

Однако, мне удалось затратить на это что-то около пары часов. Хочу поделиться технологией.

Технология

Я воспользовался Питоном. В его комплекте поставки есть интерфейс командной строки, где можно выполнять операторы языка и целые скрипты в интерактивном режиме. Это очень удобно, потому что не тратится время на бесконечное "поправил-скомпилировал-проверил", которое свойственно компилируемым языкам. И не подумайте, что это исключительно юниксовая штука, Питон прекрасно работает и на Windows, и на Mac'е.

Так вот, я загрузил этот интерфейс и стал прямо там считывать с диска дирекотрии с фотками и пошагово делать всякие перемещения-переименования. Как только последовательность действий была отлажена, я собрал все строчки вместе в окошке текстового редактора и стал просто copy-paste'ить их в командную строку Питона, заменяя названия директорий.

Сначала надо было слить фотки из нескольких поддиректорий-частей одного дня в общий список с переименованием по порядку:

count=1
folder='16.10.2005/'

# Повторить для каждой поддиректории 'part N'
files=os.listdir(path+folder+'part 1')
files.sort()
for f in files:
  os.rename(path+folder+'part 1/'+f,path+folder+'%03d.jpg'%count)
  count+=1

Потом составлял отдельную директорию-альбом некоторых избранных фоток. В нее попадали фотки из разных дней, поэтому в ней тоже могли мешаться одинаково называющиеся файлы. Чтобы это обойти, я каждый раз, после копирования в эту директорию файлов одного дня запускал скриптик, который переименовывает новые фотки в порядке поступления, но немножко в другом виде, чтобы переименованные отличались от новых (просто "_" добавлял в начале):

count=1
folder=path+'album/'

#Повторить после каждого копирования новых фоток
files=[f for f in os.listdir(folder) if not f.startswith('_')]
files.sort()
for f in files:
  os.rename(folder+f,folder+'_%03d.jpg'%count)
  count+=1

Вот таким вот образом.

Мораль

Вообще говоря, еще в отпуске прямо на пляже Jim озадачил меня вопросом переименования и подкинул идею написать простенькую тулзу, которая бы автоматизировала подобные действия. Я, правда, сразу отказался :-).

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

Во-первых, надо рисовать интерфейс. А во-вторых, в тулзе, поскольку она предназначена не для моих конкретных семи директорий, а для общих случаев, придется программировать тучу специфических ситуаций:

А потом, после всего этого придет в голову мысль, что надо вообще не по исходной структуре ориентироваться, а просто брать всю толпу фоток, считывать из JPEG'ов время фотографирования и просто распихивать их в порядке снятия в новую структуру директорий. А это значит, что надо идти искать библиотечку по чтению EXIF и читать, как ею пользоваться. В общем, черт его знает, сколько это все займет :-).

Сейчас же я всю эту логику по поиску директорий и сбрасыванию счетчика "реализовал" вручную, и это оказалось проще, чем думать, как это спрограммировать.

Комментарии: 12

  1. zh

    Кстати, код в RSS ленте почемуто написался весь в одну строчку =(
    Пришлось заходить на Блог и выяснять детали =)

  2. М.М.

    Я для таких вещей пользуюсь Рексом. В том числе есть и программулька для той же самой цели.

    (в сторону) Жаль что IBM не смогла реализовать его потенциал.

  3. Denis

    Всё можно сделать проще с программками jhead и jtran
    по указанным в командной строке правилам пронумеруют, переименуют (могут читать из EXIF, автоматически открутят в вертикальное положение.

  4. Elf

    Вообще-то, в телефоне есть часы, согласно которым выставляется дата сохраняемых файлов (фоток). На основании этой даты с помощью подручных средств (find, cp/mv) все вышеописанное делается крайне элементарно. Если нужно что-то извлекать из exif (комменты? Или что там еще может понадобится?), то можно найти, думаю, еще одну консольную прожку, умеющую это. В итоге, простейший bash-скрипт, созданный на коленке за пару минут.

    Python тут - гаубица против комара.

    P.S. esearch exif выдал минимум 2 консольные проги, по названию, реализовывающие нужное.
    P.P.S. Если кто не понял, я имел ввиду Linux. В частности, Gentoo Linux.

  5. Mike

    Поздравляю с питоном, но с софтом, который идет с камерой видимо не повезло :(. У меня Canon, так вот если устанвить их фирменный софт для работы с камерой - достаточно нажать кнопку на фотике, когда он подключен к компу - все фотографии будут переданы и рассортированы как надо. А насчет переименований (а особенно групповых) - есть готовые утилиты, которые встроены, в том числе и просмотрщики графики. Иногда не нужно стрелять по воробьям из пушки, хотя для сохранения мозгового тонуса - это полезно. Только долго...

  6. Иван Сагалаев
        <p>Пара ответов.</p>
    

    • Время модификации файлов может измениться при всяких предварительных операциях с ними (разворот в вертикальную ориентацию, копирование чего-то туда сюда).

    • Насчет пушки и воробьев. Я понимаю, что это для большинства нормальных людей так и выглядит, но для меня это как раз самый удобный и действительно легкий инструмент оказался :-)

    За все наводки и советы спасибо!

  7. Jk

    да уж.. мне тут сразу вспомнилась ВыньХП - подрубаешь фотик, говоришь скопировать изображения и она сама все переименовывает и копирует :)
    конечно настроек особых нет, exif тоже вроде не читает. но все копируется на раз два.. и 99% юзеров наверно устраивает...

    а ты тут "всего пару часов" потратил :))

    ЗЫ. сам я этой тулзой от ХП не пользовался ни разу ;) (у меня фотки делятся по дате скидывания на веник+небольшой комент по событию)

  8. Иван Сагалаев

    Не, ребят, вы не поняли :-). С копированием из фотоаппарата проблем нет. Все точно также: вставляешь фот, вылезает окошко, где выбираешь директорию, куда сливать.

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

  9. Frag

    Питон - это конечно клёво :)
    Респект за “всего пару часов” :)
    ВинХР - не то тоже...
    ACDSee: Выделяешь все файлы, нажимаешь F2, задаёшь схему переименования.. всё.
    Главное, чтобы даты нормальные у фоток были, тогда сначала самое главное из засунуть в одну папку с любыми именами фоток, а потом, отсортировав по дате переименовать уже как надо.
    А вообще на фотике есть фича - начинать заново именование фоток или продолжать...
    ЗЫ Тожа как-то думал тулзу на пхпе написать - музыку рассортировать, и с id3-тегами разобраться... забил. Лучше чего-нить рабочее более-менее найти.. А то если уж писать, то писать, чтобы !работала! всегда, со всем, в любых условиях - тут до следующего отпуска будешь маяться :)
    С уважением.

  10. Андрей

    http://www.herve-thouzard.com/modules/wfsection/article.php?articleid=1
    Умеет читать EXIF, MP3, WAV, WMA и др.

  11. Иван Сагалаев

    Спасиб. Я, правда, для EXIF'а уже нашел другую: http://home.cfl.rr.com/genecash/digital_camera.html

  12. Sea

    http://picasa.google.com/intl/ru/ Гуглевская програмка для работы и обработки фотографий.

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