LinuxForum.Fans
Тема

Научите как создать список средствами Python

Автор: Eeb_ei4m 14 сообщений 1656 просмотров
12.03.2015 13:50 · отредактировано #417361

Есть список файлов '*.mp3'.
Надо их конвертировать в '001.ogg', '002.ogg', '003.ogg' и т.д.
В команду конвертации подставляются по очереди все входные и выходные файлы.
Как создать список из '001.ogg', '002.ogg', '003.ogg' и т.д. для выходной переменной?

На баше у меня так, это маленький кусок функции для рекурсивного переименования:

text
x=1001                                                                                         
for FILE in $(find -maxdepth 1 -type f -iname "*.mp3"); do                                     
    mv $FILE ${x:1}.ogg                                                                    
    (( x++ ))                                                                                  
done
12.03.2015 15:07 #417371

Считать список файлов, загнать его в массив и в цикле подставлять последовательно.

12.03.2015 15:36 #417379

Зачем массив? Уже есть список. В смысле list

Списки в Python - упорядоченные изменяемые коллекции объектов произвольных типов

И вы не могли бы показать примерно этот цикл? А то совет из разряда:
(как выиграть войну? победить всех врагов)

12.03.2015 15:37 · отредактировано #417380
Eeb>ei4m написал:
Есть список файлов '*.mp3'.
Надо их конвертировать в '001.ogg', '002.ogg', '003.ogg' и т.д.
В команду конвертации подставляются по очереди все входные и выходные файлы.
Как создать список из '001.ogg', '002.ogg', '003.ogg' и т.д. для выходной переменной?

Вопрос не в тему, но зачем для этого питон? Неужели стандартных возможностей шелла не хватает для этой задачи?

Я за без малого 10-ти летнюю практику в linux'е написал не на шелле не больше пары-другой скриптов. И то потому, что надо было там работать с базой данных. Вся остальная автоматизация моих действий только на шелле. Здесь же, исходя из постановки задачи, мы видим один из базовых примеров программирования на шелле. Коих в сети выложены тыщи. Задача уровня "Hello Word!".

12.03.2015 15:50 · отредактировано #417386
"Eeb>ei4m" написал:
Есть список файлов '*.mp3'.
Надо их конвертировать в '001.ogg', '002.ogg', '003.ogg' и т.д.
text

#!/bin/bash

for SRC in *.mp3; do · DEST="${SRC%.mp3}.ogg" · echo "convertor" "'$SRC'" "'$DEST'" done

средствами Python

я и на BrainFuck могу, но д/з только за деньги.

12.03.2015 16:03 · отредактировано #417389
Cruiser78 написал:
[quote=Eeb>ei4m]Есть список файлов '*.mp3'.
Надо их конвертировать в '001.ogg', '002.ogg', '003.ogg' и т.д.
В команду конвертации подставляются по очереди все входные и выходные файлы.
Как создать список из '001.ogg', '002.ogg', '003.ogg' и т.д. для выходной переменной?

Вопрос не в тему, но зачем для этого питон? Неужели стандартных возможностей шелла не хватает для этой задачи?

Я за без малого 10-ти летнюю практику в linux'е написал не на шелле не больше пары-другой скриптов. И то потому, что надо было там работать с базой данных. Вся остальная автоматизация моих действий только на шелле. Здесь же, исходя из постановки задачи, мы видим один из базовых примеров программирования на шелле. Коих в сети выложены тыщи. Задача уровня "Hello Word!".[/quote]

Ух-ты! 10 лет! Ну ты и молодец!

1) Задача совсем не простая, я её упростил для вопроса. Если пойму как, дальше сам сделаю.
2) В интернете выложены тыщи говна, по моему вопросу не нашёл.
3) Я хочу перевести собственный скрипт написанный на bash на python (с целью изучения питона)
4) Ваш вопрос действительно не в тему. Так я могу и с подругой о программировании поговорить. Для флуда есть целый раздел.

drBatty написал:
[quote="Eeb>ei4m"]Есть список файлов '*.mp3'.
Надо их конвертировать в '001.ogg', '002.ogg', '003.ogg' и т.д.
text

#!/bin/bash

for SRC in *.mp3; do · DEST="${SRC%.mp3}.ogg" · echo "convertor" "'$SRC'" "'$DEST'" done

средствами Python

я и на BrainFuck могу, но д/з только за деньги.
[/quote]

Да не надо мне готового решения ни на баше ни на С. Я и сам могу.
Хочу питон выучить.

12.03.2015 16:05 #417392
"Eeb>ei4m" написал:
И вы не могли бы показать примерно этот цикл?

не нужен тут никакой цикл:
[console]>>> l = [1,2,3,4,5]
>>> def f(x): return x+100
...
>>> map(f, l)
[101, 102, 103, 104, 105]
[/console]
надеюсь идея понятна. На всякий случай: https://docs.python.org/2/tutorial/datastructures.html

12.03.2015 16:12 · отредактировано #417399

Да, вроде понял. Надо поробовать map. Только ссылка устарела она для второго питона. У меня самая большая трудность в том что хочу нумерацию с 001.
Если '001' строка то не увеличить на единицу. Если цифра то 001 интерпритируется как единица.

12.03.2015 16:19 · отредактировано #417403
Eeb>ei4m написал:
У меня самая большая трудность в том что хочу нумерацию с 001.
Если '001' строка то не увеличить на единицу. Если цифра то 001 интерпритируется как единица.

у типов string, unicode и byte есть специально для таких случаев метод format (и устаревший, но до сих пор широко распространённый оператор %)

12.03.2015 16:23 #417405

Да, наверное format подойдёт. Спасибо пошёл пробовать.

12.03.2015 18:43 #417423
Eeb>ei4m написал:
Да, наверное format подойдёт. Спасибо пошёл пробовать.

Не нравится format - можете использовать rjust: :)

text
str(index).rjust (3, '0')
13.03.2015 00:20 · отредактировано #417474

Удалось сформировать список имён для выходных файлов.
Можно это как то улучшить?

text

newname = []
numeric = [format(i + 1, '03d') for i in range(len(filelist))]
for i in numeric:
    fullname = (i + '{}'.format('.ogg'))
    newname.append(fullname)
13.03.2015 07:55 #417483
"Eeb>ei4m" написал:
Только ссылка устарела она для второго питона.

в третьем как-то по другому?

"Eeb>ei4m" написал:
У меня самая большая трудность в том что хочу нумерацию с 001.

facepalm

НЕ нужно никакой нумерации.

"Eeb>ei4m" написал:
Можно это как то улучшить?

идите, и узнайте, что такое СПИСОК.

[console]>>> l = [ '1.ogg', '002.ogg', '-000007.ogg', '0.ogg' ]
>>> import re
>>> def sub_ogg_mp3(s): return re.sub('.ogg', '.mp3', s)
...
>>> map(sub_ogg_mp3, l)
['1.mp3', '002.mp3', '-000007.mp3', '0.mp3']
[/console]

Для тех, кто в танке: map это не функция, map это синтаксический сахар. В сишке map нет, там явно надо писать

text
for(j=0; j<N; j++)
  a[j] = 17;

в питоне — не нужно.

ВНЕЗАПНО: в третьем питоне — тоже не нужно костылить циклы.

13.03.2015 09:10 #417487
text
dsts = map(lambda(i): '{0:03}.ogg'.format(i), range(len(srcs)))
Войдите или зарегистрируйтесь, чтобы ответить.