Использование Python для выполнения команды для каждого файла в папке
Я пытаюсь создать Python script, который:
- Посмотрите папку "/input"
- Для каждого видео в этой папке запустите команду mencoder (чтобы перекодировать их на то, что воспроизводится на моем телефоне)
- Как только mencoder завершит свой запуск, удалите исходное видео.
Это не кажется слишком сложным, но я сосать на python:)
Любые идеи о том, как должен выглядеть script?
Бонусный вопрос: следует ли использовать
os.system
или
subprocess.call
?
Subprocess.call, похоже, позволяет читать более читаемый script, так как я могу написать команду следующим образом:
cmdLine = ['mencoder', sourceVideo, '-ovc', "Копировать", '-oac', "Копировать", '-ss', '00: 02: 54', '-endpos', '00: 00: 54', '-o', destinationVideo]
EDIT: Хорошо, это работает:
import os, subprocess
bitrate = '100'
mencoder = 'C:\\Program Files\\_utilitaires\\MPlayer-1.0rc2\\mencoder.exe'
inputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\input'
outputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\output'
for fichier in os.listdir(inputdir):
print 'fichier :' + fichier
sourceVideo = inputdir + '\\' + fichier
destinationVideo = outputdir + '\\' + fichier[:-4] + ".mp4"
commande = [mencoder,
'-of',
'lavf',
[...]
'-mc',
'0',
sourceVideo,
'-o',
destinationVideo]
subprocess.call(commande)
os.remove(sourceVideo)
raw_input('Press Enter to exit')
Я удалил команду mencoder, для ясности и потому, что я все еще работаю над ней.
Спасибо всем за ваш вклад.
Ответы
Ответ 1
Чтобы найти все имена файлов, используйте os.listdir()
.
Затем вы перебираете имена файлов. Например:
import os
for filename in os.listdir('dirname'):
callthecommandhere(blablahbla, filename, foo)
Если вы предпочитаете подпроцесс, используйте подпроцесс.: -)
Ответ 2
Используйте os.walk, чтобы рекурсивно перебирать содержимое каталогов:
import os
root_dir = '.'
for directory, subdirectories, files in os.walk(root_dir):
for file in files:
print os.path.join(directory, file)
Никакая реальная разница между os.system и subprocess.call здесь - если вам не приходится иметь дело с чужими именованными файлами (имена файлов, включая пробелы, кавычки и т.д.). Если это так, subprocess.call определенно лучше, потому что вам не нужно делать какие-либо ссылки на имена файлов. os.system лучше, когда вам нужно принять любую действительную команду оболочки, например. полученных от пользователя в файле конфигурации.
Ответ 3
Python может быть лишним для этого.
for file in *; do mencoder -some options $file; rm -f $file ; done
Ответ 4
AVI
до MPG
(выберите ваши расширения):
files = os.listdir('/input')
for sourceVideo in files:
if sourceVideo[-4:] != ".avi"
continue
destinationVideo = sourceVideo[:-4] + ".mpg"
cmdLine = ['mencoder', sourceVideo, '-ovc', 'copy', '-oac', 'copy', '-ss',
'00:02:54', '-endpos', '00:00:54', '-o', destinationVideo]
output1 = Popen(cmdLine, stdout=PIPE).communicate()[0]
print output1
output2 = Popen(['del', sourceVideo], stdout=PIPE).communicate()[0]
print output2
Ответ 5
Или вы можете использовать функцию os.path.walk, которая больше работает для вас, чем просто os.walk:
Глупый пример:
def walk_func(blah_args, dirname,names):
print ' '.join(('In ',dirname,', called with ',blah_args))
for name in names:
print 'Walked on ' + name
if __name__ == '__main__':
import os.path
directory = './'
arguments = '[args go here]'
os.path.walk(directory,walk_func,arguments)
Ответ 6
У меня была аналогичная проблема, с большой помощью из Интернета, и этот пост я сделал небольшое приложение, моя цель - VCD и SVCD, и я не удаляю исходный код, но я считаю, что будет довольно легко адаптироваться к вашим собственным потребностям.
Он может конвертировать 1 видео и вырезать его или конвертировать все видео в папку, переименовывать их и помещать в подпапку /VCD
Я также добавляю небольшой интерфейс, надеюсь, что кто-то найдет его полезным!
Я помещаю здесь код и файл: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/