Использование Python для выполнения команды над каждым файлом в папке

StackOverflow https://stackoverflow.com/questions/1120707

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

Это не кажется слишком сложным, но я плохо разбираюсь в python :)

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

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

операционная система

или

подпроцесс.вызов

?

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

cmdLine = ['mencoder', Исходное видео, '-ovc', 'копировать', '-oac', 'копировать', '-ss', '00:02:54', '-конечные точки', '00:00:54', '-o', Пункт назначения видео]

Редактировать :Хорошо, это работает :

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Использование ос.ходить для рекурсивного перебора содержимого каталога:

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 и подпроцессом.звоните сюда - если только вам не приходится иметь дело с файлами со странными именами (имена файлов включают пробелы, кавычки и так далее).Если это так, выполните подпроцесс.call определенно лучше, потому что вам не нужно заключать имена файлов в кавычки в командной строке.os.system лучше, когда вам нужно принять любую допустимую команду оболочки, напримерполучено от пользователя в файле конфигурации.

Python может быть излишеством для этого.

for file in *; do mencoder -some options $file; rm -f $file ; done

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

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

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

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

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

Кстати, я поместил код и файл сюда: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top