Использование Python для выполнения команды для каждого файла в папке - PullRequest
48 голосов
/ 13 июля 2009

Я пытаюсь создать скрипт Python, который бы:

  1. Загляните в папку "/ input"
  2. Для каждого видео в этой папке выполните команду mencoder (чтобы перекодировать их во что-нибудь воспроизводимое на моем телефоне)
  3. Как только mencoder закончит свой запуск, удалите оригинальное видео.

Это не кажется слишком сложным, но я отстой в питоне:)

Есть идеи, как должен выглядеть сценарий?

Бонусный вопрос: я должен использовать

os.system

или

subprocess.call

Subprocess.call, кажется, допускает более читаемый скрипт, так как я могу написать команду следующим образом:

cmdLine = ['mencoder', sourceVideo, '-Ovc', «Копировать», '-Oac', «Копировать», '-Ss', '00: 02: 54' , '-Endpos', '00: 00: 54' , '-O', destinationVideo]

РЕДАКТИРОВАТЬ: Хорошо, это работает:

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, для ясности и потому, что все еще работаю над ней.

Спасибо всем за ваш вклад.

Ответы [ 6 ]

100 голосов
/ 13 июля 2009

Чтобы найти все имена файлов, используйте os.listdir().

Затем вы перебираете имена файлов. Вот так:

import os
for filename in os.listdir('dirname'):
     callthecommandhere(blablahbla, filename, foo)

Если вы предпочитаете подпроцесс, используйте подпроцесс. : -)

25 голосов
/ 13 июля 2009

Используйте 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 лучше, когда вам нужно принять любую допустимую команду оболочки, например получено от пользователя в файле конфигурации.

11 голосов
/ 13 июля 2009

Питон может быть излишним для этого.

for file in *; do mencoder -some options $file; rm -f $file ; done
2 голосов
/ 13 июля 2009

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
1 голос
/ 27 августа 2010

У меня была похожая проблема, с большой помощью из Интернета, и в этом посте я сделал небольшое приложение, моя цель - VCD и SVCD, и я не удаляю источник, но я думаю, что его будет довольно легко адаптировать для ваших собственных нужд.

Может конвертировать 1 видео и вырезать его или конвертировать все видео в папке, переименовывать их и помещать в подпапку / VCD

Я также добавляю небольшой интерфейс, надеюсь, кто-то еще найдет его полезным!

Я положил код и файл здесь, кстати: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/

1 голос
/ 13 июля 2009

Или вы можете использовать функцию 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)
...