LINUX.ORG.RU

Редактирование имён файлов на Python

 


0

0

Помогите с реализацией ленивого подгона фоток под нужды фотоальбома, файлы в контейнерах вставляются в html:

<div class=«mosaicflow__item»>
<a class=«fancyimage» data-fancybox-group=«group» >href=«/images/gallery/test/2.jpg»>
<img src=«/images/gallery/test/2.jpg» />
</a>
</div>

Я всё это говно вывожу с застрингованной переменной (имя файла) которая меняется на +1 до края (соответствующего количеству файлов). да да я только учусь, взял для реализации код из решённой задачи с учебника:

#выдаёт контейнер для массива фотографий с именами от 1...n
int_min = 1
interval = 1
int_max = int(input(«Максимальное число:»))

for i in range(int_min, int_max, interval):
print("' <div class=«mosaicflow__item»>
<a class=«fancyimage» data-fancybox-group=«group» >href=«/images/gallery/test/"' + str(i) + "'.jpg»>
<img src=«/images/gallery/test/"' + str(i) + >"'.jpg» />
</a>
</div>

"')
input('\nPress enter for exit')

теперь непосредственно ЗАДАЧА:

2) необходимо сделать скрипт наследующий вот этот самый счёт от min до max который будет:

а) подсчитывать количество файлов в папке;
в) выстраивать их в порядке, необходимом для последовательного перебора файлов;
б) записывать количество файлов в папке как значение int_max;
г) брать текущее значение переменной;
д) подставлять его вместо имени файла в формате, наверное опять таки: str(i) + «jpg»
е) брать следующий файл

или дайте софтину обжимающую фотки 900x600 какогонить со сменой имён на цифры 1....n для Fedora22



Последнее исправление: JB (всего исправлений: 2)

Ответ на: комментарий от MrClon

взять список файлов в директории и делать for по этому списку?

проясни, пожалуйста, свой метод, я так кратко не пойму.

P.S. вот нашёл как имена в элементы списка тут

http://senkler.blogspot.com/2011/04/python.html а как обратно, если создам список с значением элементов от 1 до n и присвоить значения элементов как имена файлам.

ghett
() автор топика

HTML код вперемешку с питоном.

Хосспаде, и откуда вы только лезете? Зачем вы тащите этот ужас из начала девяностых к нам в 21 век? Неужто так сложно юзать шаблоны, чтобы код - отдельно, HTML - отдельно? Тогда и проблем никаких с «подгонкой» чего либо куда либо не будет.

cherry-pick
()
Ответ на: комментарий от cherry-pick

Хосспаде, и откуда вы только лезете?

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

ghett
() автор топика
Ответ на: комментарий от cherry-pick

«…ужас из начала девяностых» это ты про HTML или про python? Они обе примерно оттуда на сколько я помню.

MrClon ★★★★★
()
Ответ на: комментарий от cherry-pick

юзать шаблоны,

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

ghett
() автор топика
Ответ на: комментарий от MrClon

может про инторнет или про неквантовый компутер....

ghett
() автор топика
Ответ на: комментарий от ghett

Ну вот есть у тебя директория /images/gallery/test/, в неё сколько-то файлов изображений. Получаешь список (массив) файлов находящихся в этой директории (google://python+список+файлов+в+директории), потом проходишь по этому списку циклом for (for file_name in list_of_files: print file_name), ?????, PROFIT

Если в директории /images/gallery/test/ не только нужные изображения, но и ещё какие-то файлы (например .db которые любит разбрасывать винда) то можно предварительно пройтись по списку файлов выкинув из него всё лишнее (или выбрав из него только нужное).

P.S. купи/скачай книжку «изучаем python» Лутца, прочти пару первых содержательных глав (вступительные можно пропустить).

MrClon ★★★★★
()

Кстати да, шаблоны это православно.
Как минимум б анальное

template = '''<div class="mosaicflow__item">
    <a class="fancyimage" data-fancybox-group="group" >href="/images/gallery/test/%s">
        <img src="/images/gallery/test/%s" />
    </a>
</div>'''

filename = 'somename.jpg'
print template % (filename, filename)

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

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

import os
directory = '/images/gallery/test/'
files = os.listdir(directory)
kotoraya stanet spiskom tipa ['photoes.zip', '1.jpg', '2.jpg', '3.jpg', 'im.gif', 'document.pdf']

дальше я меняю значения элементов на 1,2,3....n пока не конец списка (КАК!?) и меняю имена фалов , как!?!?

отом проходишь по этому списку циклом for

тоесть получив список файлов я могу непосредственно уже работать с именами без всего другого, а как указать циклу что следущим нужно брать и на какое число менять ну ладно, а если взять то что есть

for i in range(int_min, int_max, interval):

подставлять в for file_name in list_of_files: print file_name <--- подставлять i вместо file_name, что такое «list_of_files»?

ghett
() автор топика
Ответ на: комментарий от MrClon

интересно, конечно, но я не понял, там ошибка внизу

print(template % (filename, filename)

и я не понял как его испльзовать, где указать значения которые %s должно принимать 1.jpg, 2.jpg .... n.jpg

ghett
() автор топика
Ответ на: комментарий от ghett

Зачем превращать '4.jpg' в 4, если в результате всё-равно нужно получить '4.jpg'?

list_of_files, как это не парадоксально, это переменная в которой лежит список файлов.

Смотри:

some_list = ['vodka', 'balalayka', 'medved']
for word in some_list:
    print word


При каждой этерации цикла for переменная word будет последовательно принимать значение одного из элементов списка (массива) some_list. В результате такой код напечатает
vodka
balalayka
medved


Ты случайно Си не изучал в школе или вузе?

Иди читай Лутца и не нервируй меня.

MrClon ★★★★★
()
Ответ на: комментарий от Virtuos86

Но мне сдается, что вы с ним всё-таки из девяностых.

Не знаю за ТС, а я таки-да из начала десяностых (1990 года рождения). Более того, я действительно ужас, ужас летящий на крыльях ночи!

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Вот, а был бы постарше, предпочитал по ночам спать.

Ты не знаком с такой точкой зрения, что помогать таким неумехам, как ТС, попросту вредно для них же самих, а для советчика простая трата времени, поскольку решение пустяковых задач ничего не дает, в отличие от помощи при решении сложных и неординарных проблем?

Virtuos86 ★★★★★
()
Ответ на: комментарий от MrClon

Зачем превращать '4.jpg' в 4

про то что он расширения трогает речи не шло

Смотри:
читай Лутца

спасибо, не смею задерживать.

таким неумехам

это от «Не умеет»?

ghett
() автор топика
Ответ на: комментарий от Psych218

template.format(name, i)

добра, теперь осталось понять что в шаблоне записать

import os
directory = '/home/workmachine/source'
list_of_files = os.listdir(directory)
i = 0
for name in list_of_files:
print(template.format(name, i))
i += 1

ghett
() автор топика
Ответ на: комментарий от ghett

Да что надо тебе, то и пиши. {0} станет именем файла, {1} станет номером файла.

Тебе файлы переименовать надо, или нет? Если да, то как-то, совсем уж на пальцах объясняю:

import os  # для списка файлов и переименования нужен модуль os
# Шаблон, какой тебе нужен
htmltemplate = """<html><head>блаблабла<body>{0}</body></html>"""
# шаблон для одной записи
template = '<div class="blablabla"><img src="{1}" alt="{0}" /></div>'
html = []
i = 0
for oldname in os.listdir(directory):
    # сперва переименовываем файл
    os.rename(oldname, "{}.jpg".format(i))
    # теперь добавляем в этот твой html шаблон с новым именем
    html.append(template.format(i))
    i += 1
# собираем всё вместе:
fullhtml = htmltemplate.format('\n'.join(html))
# всё, здесь хоть на терминал выводи, хоть в файл отправляй, хоть сразу на сервер запросом отсылай. Ну для примера просто напечатаем
print(fullhtml)

Не совсем на пальцах: google python+os, google python+format. А лучше вообще какую-нибудь книжечку.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)
Ответ на: комментарий от Psych218

Тебе файлы переименовать надо, или нет?

Псих ты бох! Сделал что бы сразу переименовывал и собирал в контейнеры! Зашибись.

for oldname in os.listdir(directory): сюда воткнул путь;

Запустил, выдало:

line 10, in <module>
os.rename(oldname, «{}.jpg».format(i))
FileNotFoundError: [Errno 2] No such file or directory: 'IMG_7587.JPG' -> '0.jpg'

Он зашёл, нашёл, но испугался, что не так?

google python+os, google python+format. А лучше вообще какую-нибудь книжечку.

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

ghett
() автор топика
Ответ на: комментарий от ghett

FileNotFoundError: [Errno 2] No such file or directory: 'IMG_7587.JPG' -> '0.jpg'

Ну видимо запускается не из той директории. Надо в неё войти. Либо писать абсолютный/относительный путь навроде: os.path.join(directory, oldname)

Psych218 ★★★★★
()
Ответ на: комментарий от Dred

для таких случаев придумали enumerate

Да, действительно. Что-то не вспомнил про него. Спасибо.

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

name oldname can not be defined а как он его определит, оно же позже объявляется а путь писать же надо до цикла, прально?

ghett
() автор топика
Ответ на: комментарий от ghett

Эм… почему до цикла? В строчке с os.rename просто замени тупо имя файла (oldname) на имя файла с путём (os.path.join(directory, oldname)). Либо просто запускай как есть, но уже в целевой директории.

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

дядь но уже лучше

import os  # для списка файлов и переименования нужен модуль os
# Шаблон, какой тебе нужен
htmltemplate = """<html><head>блаблабла<body>{0}</body></html>"""
# шаблон для одной записи
template = '<div class="blablabla"><img src="{1}" alt="{0}" /></div>'
html = []
i = 0
for oldname in os.listdir("/home/workmachine/test400"):
    # сперва переименовываем файл
    os.rename(os.path.join("/home/workmachine/test400", oldname), "{}.jpg".format(i))
    # теперь добавляем в этот твой html шаблон с новым именем
    html.append(template.format(i))
    i += 1
# собираем всё вместе:
fullhtml = htmltemplate.format('\n'.join(html))
# всё, здесь хоть на терминал выводи, хоть в файл отправляй, хоть сразу на сервер запросом отсылай. Ну для примера просто напечатаем
print(fullhtml)
получаю ошибку на

File «/home/workmachine/PycharmProjects/renamer_maker>/contmaker_renamer.py», line 13, in <module>
html.append(template.format(i))
IndexError: tuple index out of range

попробовал вот этим вариантом:

import os
os.chdir('/home/workmachine/source')
l = os.listdir('.')
l.sort()
for i, f in enumerate(l):
os.rename(f, '%d.jpg' % i)
сработало! вот этот тоже да! Подскажите утилиту по работе с .jpg для Fedora (комментарий) Так что осталось твой домучать, если ты конечно, меня не пошлёшь, и буду счастлив. мне твой больше нравится так как сразу хтмл верстает, бомба, что не так скажи, где я опять дебил?

ghett
() автор топика
Ответ на: комментарий от Psych218

Ты видал, я эволюционирую, уже код помечаю

ghett
() автор топика

Если тебе нужно просто пережать фотки в папке и переименовать их по номеру, то для этого можно быстренько строчку на баше накалякать.

count=0; for i in *; do convert -resize 900x600 "$i" $count.jpg; ((count+=1)); done

Тебе нужен будет установленный imagemagick

gnunixon ★★★
()
Последнее исправление: gnunixon (всего исправлений: 1)
Ответ на: комментарий от gnunixon

а как насчёт вертикальных, потому что с терминалом решаю тему тут Подскажите утилиту по работе с .jpg для Fedora (комментарий) и встаёт вопрос о распознавании 900x600 или же 600x900 а так то действительно коротенько всё, спасибо

ghett
() автор топика
Ответ на: комментарий от Virtuos86

Вот, а был бы постарше, предпочитал по ночам спать.

Так я во сне и летаю. С крыши.

Ты не знаком с такой точкой зрения, что помогать таким неумехам, как ТС, попросту вредно для них же самих

Так я не готовый код ему скинул всё-таки.

MrClon ★★★★★
()
Ответ на: комментарий от Psych218

Кто-то может мне объяснить откуда в задаче вообще взялась потребность знать порядковый номер изображения?

MrClon ★★★★★
()
Ответ на: комментарий от ghett

встаёт вопрос о распознавании 900x600 или же 600x900

видимо ты думаешь что imagemagick дураки делали, так я тебя огорчу

zolden ★★★★★
()
Ответ на: комментарий от MrClon

от того что фотогалерея состот из двух скриптов и цсски в коде линк на фотофайл заворачивается в контейнер для этих двух скриптов. при формировании галерей на 300 элементов сам собой встал вопрос о автоматизации процесса написания кода и папок. теперь я скриптом формирую код контейнеров например на 255 фоток с именами 1...255.jpg и так же благодаря скрипту пайтона имею папку с 255 файлами и именами в диапазоне 1...255.jpg . От так, и вроде как и пайтон на работе использую, хоть и от того что другого ничего не учу, как то на душе повеселело, Психа код доработаю, ему спасибо большое, попробую объеденить с энумерэйтом что бы 2 в 1 по нормальному.

ghett
() автор топика
Ответ на: комментарий от ghett

И как это отвечает на мой вопрос? У тебя уже есть имя файла (например 17.jpg, или r.jpg), зачем тебе при генерации HTML кода галереи знать его номер? Главное что-бы файлы бы файлы в списке файлов были упорядоченны правильно.

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

линк на фотофайл заворачивается в контейнер для этих двух скриптов

ghett
() автор топика
Ответ на: комментарий от MrClon

{1} станет номером файла.

прости, я вчера уже мозг в трубочку завернул и не прочёл детально, дейтсвительно никаких номеров нет и не нужно.

ghett
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.